Callback cho hàm không có argument

Mình thắc mắc việc truyền con trỏ hàm callback đến hàm không có đối số có thể gây lỗi gì trên stack hay không?
Cụ thể ví dụ sau:

#include <stdio.h>

typedef void (*onCallback_f)(void* data);

struct callback_obj_t {
	onCallback_f 		callback;
	void 				*data;
};

struct callback_obj_t cbObj;


void printString()
{
	printf("Hello\n");
}

void addCallback(onCallback_f cb, void* data)
{	
	cbObj.callback = cb;
	cbObj.data = data;	
}


int main()
{
	addCallback(&printString, NULL);
	printString();
	cbObj.callback(cbObj.data);
    printString();
	return 0;
}

Ở đây hàm addCallback yêu input vào ở argument đầu tiên là một hàm theo dạng void foo(void*)
Tuy nhiên, lúc truyền vào thì mình truyền một hàm theo dạng void goo()
Mình không biết hành vi của chương trình sẽ làm gì với đối số NULL mình truyền vào?
Theo kết quả chạy chương trình tại đây: https://repl.it/repls/KnowingHeftyKeyboard thì chưa thấy vấn đề gì.

Cái này thì tùy vào calling convention mà sẽ có ảnh hưởng hay không.
Do đa số compiler bây giờ đều dùng cdecl nên thông thường sẽ thấy nó không có vấn đề gì.
Nhưng nếu là stdcall trên hệ thống x86 thì có thể sẽ crash với đoạn code sau:

#include <stdio.h>
#define CALL_CONVENTION __attribute__((stdcall))
typedef void (CALL_CONVENTION *onCallback_f)(const void* data);

struct callback_obj_t {
	onCallback_f  callback;
	const void       *data;
};

struct callback_obj_t cbObj;

CALL_CONVENTION
void printString()
{
    printf("Param %s\n", "None");
    fflush(stdout);
}

void addCallback(onCallback_f cb, const void* data)
{	
	cbObj.callback = cb;
	cbObj.data = data;	
}

void f(const char * s)
{
	addCallback((onCallback_f)printString, s);
	cbObj.callback(cbObj.data);
	cbObj.callback(cbObj.data);
}

int main(){
    f("test");
    printf("Success\n");
    fflush(stdout);
}

Link live demo: https://gcc.godbolt.org/z/1Wy5y0

7 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?