我们对这行代码有一个Coverity错误:
snprintf( tempStr, size, testStrings[testID], A2DtoV(testResults[testID].value), A2DtoV(testResults[testID].min),A2DtoV(testResults[testID].max));
错误说:
non_const_printf_format_string: "format string is not a string literal, potential security vulnerability if user controlled"
我将testStrings更改为const,但是没有做任何事情:
static const char *testStrings[] = {"1", ... etc};
关于这个错误究竟是什么意思的任何想法?
你的代码很好.
问题是,如果将用户控制的字符串作为printf格式字符串传递,则可能会出现安全漏洞.
例如, printf(userName);
userName由用户提供,用户可以传递"%s",并使您的函数开始访问堆栈上随机地址的数据,这可能会导致崩溃.printf将尝试从堆栈中弹出其他参数,从而导致堆栈损坏.像这样的拒绝服务攻击可能是最好的情况,可以通过让printf转储堆栈上的值来公开信息,甚至有办法让printf样式函数修改堆栈上的返回地址.
由于您的字符串不受用户控制,因此可以安全地忽略此消息.典型的解决方法是替换我给出的printf示例printf("%s", userName);
,这对您的情况似乎没有帮助,因为const字符串似乎包含格式字符串.
Wikipedia在格式字符串漏洞方面有更多内容:http://en.wikipedia.org/wiki/Format_string_vulnerabilities