"警告:无效的格式字符串转换" [printf-like-function]仅在CUDA源文件中

时间:2016-01-15 23:37:11

标签: gcc cuda printf

使用'中的printf-like-function格式说明符会导致警告。

class LogController
{
    auto __attribute__((format(printf, 2, 3)))
         insertLogEntry( const char * formatString, ... ) -> void;
}

...
LogController lc;
lc.insertLogEntry( "Some data %'d", int_value );   // warning in .cu file
                                                   // in .cpp file OK

我觉得这是一个nvcc问题,避免警告的唯一方法是 移动 一行foo.insertLogEntry()一个.cpp文件。

即使它位于.cu文件中,它也是host而不是device函数。知道怎么摆脱警告吗?

更新

  

'根据此siteextension supported on all POSIX.1-2008-conforming systems。   问题是cudafe是否必须支持这一点,即使是底层编译器也是如此   gcc 4.9.3

更新

talonmies 建议使用--dryrun,这会导致警告:

  

cudafe --allow_managed --m64 --gnu_version=40903 --c++11 -tused --no_remove_unneeded_entities --debug_mode --gen_c_file_name "/tmp/tmpxft_000026f9_00000000-4_CudaDevice.cudafe1.c" --stub_file_name "/tmp/tmpxft_000026f9_00000000-4_CudaDevice.cudafe1.stub.c" --gen_device_file_name "/tmp/tmpxft_000026f9_00000000-4_CudaDevice.cudafe1.gpu" --nv_arch "compute_30" --gen_module_id_file --module_id_file_name "/tmp/tmpxft_000026f9_00000000-3_CudaDevice.module_id" --include_file_name "tmpxft_000026f9_00000000-2_CudaDevice.fatbin.c" "/tmp/tmpxft_000026f9_00000000-7_CudaDevice.cpp1.ii"

我必须承认,我不知道接下来我能做什么......

更新

OS: SLES 11 SP3
NSight 7.5
gcc 4.9.3 with -Wall -Werror -Wextra

更新

使用const char *格式字符串不是一个选项,因为我想保持编译器执行格式检查。

2 个答案:

答案 0 :(得分:1)

来自NVIDIA的Mark证实了这个错误,它将在CUDA 8中修复。

目前我将日志消息解压缩到.cpp文件中,以避免每次编译项目时出现警告。

答案 1 :(得分:0)

  

知道如何摆脱警告吗?

试试这个:

initState