#include <stdio.h>
#include <string.h>
int foo(char* a)
{ char str[10];
if (strlen(a)<10)
{
sprintf(str,"Yes");
puts(str);
return 0;
}
else
{
sprintf(str,"No");
puts(str);
return 1;
}
}
现在,让我们说在编写LLVM传递时,我想确保不是调用 sprintf 而是调用 printf (使用相同的参数)。我怎么能这样做呢?
答案 0 :(得分:2)
简而言之,
CallInst
,请检查是否是对sprintf
的调用(您只需检查其名称)。CallInst
via CallInst::Create),调用printf
而不是sprintf
。我认为获取Value
printf
的最简单方法声明是使用Module::getOrCreate
方法之一。printf
的类型应与sprintf
减去第一个参数的类型相同。sprintf
相同,减去第一个参数。replaceInstWithInst
(in BasicBlockUtils.h)可能是最方便的方式。puts
次呼叫。答案 1 :(得分:1)
#ifdef USE_BUFFER
#define my_printf(...) sprintf(buffer, __VA_ARGS__)
#else
#define my_printf(...) printf(__VA_ARGS__)
#endif
现在您可以使用例如my_printf("My name is %s.", "Bozo");
,默认情况下它将编译为printf("My name is %s.", "Bozo")
。
如果在标题之前包含#define USE_BUFFER
,则会在编译时将这些行转换为sprintf(buffer, "My name is %s.", "Bozo")
。当然,变量buffer
必须存在于上下文中。