如何使用原始名称为库函数创建包装器?
How to create wrappers to library functions with original name?
我发现这个问题很有趣:How to force compilation error if function return value is not checked?
如果不检查 return 值,将强制执行编译错误。我写了一个问题的答案,您可以在其中使用这样的 gcc 扩展:
__attribute__ ((warn_unused_result)) int foo (void)
{
return 5;
}
强制发出警告并使用 -Werror=unused-result
进行编译以使编译器在您未以某种方式使用 return 值时生成错误。
现在我想为常规标准函数创建包装函数。一个想法是像这样重命名它们:
__attribute__ ((warn_unused_result)) realloc_wrapper(void *ptr, size_t new_size)
{
return realloc(ptr, new_size);
}
但问题是这迫使我使用不同的名称,这会导致大量的搜索和替换。当然,这可以自动完成,但仍然如此。最好,我希望能够创建一个 header,我可以使用它来代替任何程序的标准 C header。一个用例是调试一个大程序。然后这会立即指出错误的潜在原因。
TL;DR
简而言之,我希望能够参加这个项目:
#include <stdlib.h>
int main(void)
{
char *ptr;
realloc(ptr, 42);
}
并将其更改为:
// Replaced stdlib with a custom header
#include <mystdlib.h>
int main(void)
{
char *ptr;
realloc(ptr, 42);
}
然后带有 realloc
的行应该生成警告。
我可能会补充一点,我可以接受并非 100% 完美的解决方案。预期用途是用于调试而不是生产代码。
编辑:
我只是注意到 realloc
是一个错误的选择,因为它似乎已经默认具有此声明,但我使用了 PSkocik 并使其适用于 fgets
。
一个直接的解决方案是用一个同名的宏隐藏函数。 (我将使用 puts
作为示例,因为正如您所提到的,realloc
通常已经用 warn_unused_result
声明)
/*begin your header:*/
#include <stdio.h>
__attribute ((__warn_unused_result__)) static inline
int puts_wrapper(char const*X)
{
return (puts)(X);
}
#define puts(X) puts_wrapper(X)
/*end your header*/
int main(void) { puts("hello, world"); }
(puts
周围的括号不是必需的,但如果需要,它们允许您将定义移动到 puts_wrapper
定义之前。)
或者,您可以简单地重新声明添加了 warn_unused_result
属性的函数(适用于 gcc 和 clang)。
/*begin your header*/
#include <stdio.h>
__attribute ((__warn_unused_result__)) int puts(char const*);
/*end your header*/
int main(void) { puts("hello, world"); }
我发现这个问题很有趣:How to force compilation error if function return value is not checked?
如果不检查 return 值,将强制执行编译错误。我写了一个问题的答案,您可以在其中使用这样的 gcc 扩展:
__attribute__ ((warn_unused_result)) int foo (void)
{
return 5;
}
强制发出警告并使用 -Werror=unused-result
进行编译以使编译器在您未以某种方式使用 return 值时生成错误。
现在我想为常规标准函数创建包装函数。一个想法是像这样重命名它们:
__attribute__ ((warn_unused_result)) realloc_wrapper(void *ptr, size_t new_size)
{
return realloc(ptr, new_size);
}
但问题是这迫使我使用不同的名称,这会导致大量的搜索和替换。当然,这可以自动完成,但仍然如此。最好,我希望能够创建一个 header,我可以使用它来代替任何程序的标准 C header。一个用例是调试一个大程序。然后这会立即指出错误的潜在原因。
TL;DR
简而言之,我希望能够参加这个项目:
#include <stdlib.h>
int main(void)
{
char *ptr;
realloc(ptr, 42);
}
并将其更改为:
// Replaced stdlib with a custom header
#include <mystdlib.h>
int main(void)
{
char *ptr;
realloc(ptr, 42);
}
然后带有 realloc
的行应该生成警告。
我可能会补充一点,我可以接受并非 100% 完美的解决方案。预期用途是用于调试而不是生产代码。
编辑:
我只是注意到 realloc
是一个错误的选择,因为它似乎已经默认具有此声明,但我使用了 PSkocik 并使其适用于 fgets
。
一个直接的解决方案是用一个同名的宏隐藏函数。 (我将使用 puts
作为示例,因为正如您所提到的,realloc
通常已经用 warn_unused_result
声明)
/*begin your header:*/
#include <stdio.h>
__attribute ((__warn_unused_result__)) static inline
int puts_wrapper(char const*X)
{
return (puts)(X);
}
#define puts(X) puts_wrapper(X)
/*end your header*/
int main(void) { puts("hello, world"); }
(puts
周围的括号不是必需的,但如果需要,它们允许您将定义移动到 puts_wrapper
定义之前。)
或者,您可以简单地重新声明添加了 warn_unused_result
属性的函数(适用于 gcc 和 clang)。
/*begin your header*/
#include <stdio.h>
__attribute ((__warn_unused_result__)) int puts(char const*);
/*end your header*/
int main(void) { puts("hello, world"); }