-
Notifications
You must be signed in to change notification settings - Fork 79
Description
I noticed this issue when converting the Icecast code. In the file src/thread/thread.c the function:
static void *_start_routine(void *arg) is incorrectly converted to:
void _start_routine(void *arg : itype(void* ) ) : itype(void* ) ;
I created a small example that highlights the issue:
Original C code ptr_ex.c:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
static void *print_message_function( void *ptr );
int main() {
pthread_t thread;
char *message = "Thread";
int iret;
iret = pthread_create( &thread, NULL, print_message_function, (void*) message);
pthread_join(thread, NULL);
printf("Thread 1 returns: %d\n",iret);
return 0;
}
static void *print_message_function( void *ptr ) {
char *message;
message = (char *) ptr;
printf("%s \n", message);
}
I compiled this code with gcc with no issues:
gcc ptr_ex.c -lpthread
checked-c-convert output:
Note: I added #include <stdio_checked.h> and #include <stdlib_checked.h> before I ran the tool
#include <stdio_checked.h>
#include <stdlib_checked.h>
#include <pthread.h>
void print_message_function(void *ptr : itype(void* ) ) : itype(void* ) ;
int main() {
pthread_t thread;
char *message = "Thread";
int iret;
iret = pthread_create( &thread, NULL, print_message_function, (void*) message);
pthread_join(thread, NULL);
printf("Thread 1 returns: %d\n",iret);
return 0;
}
void print_message_function(void *ptr : itype(void* ) ) : itype(void* ) {
char *message;
message = (char *) ptr;
printf("%s \n", message);
}
Note that the return type for print_message_function() is changed from static void * to void, but the CheckedC return type is still itype(void* )
I could only replicate this issue when using pthread_create(). I have observed it in other parts of the Icecast code. Namely when converting src/httpp/httpp.c and src/cfgfile.c. In all cases the itype() has the correct return type, while the C return type omits the *