我们在visual studio下为windows编译了一个遗留的c ++ .dll.当我们使用不同的编译器选项编译程序时,我们遇到了不同结果的问题.
我做了一个非常简单的端口,以便我可以使用g ++在linux下编译它.我只是想看看gcc会向我发出什么样的警告,并可能尝试使用valgrind来运行它来寻找可能的错误.
这就是背景.这是个问题.我们有一堆fprintf函数调用打印到日志文件.在g ++下编译时,我收到这样的警告.
../f11.cpp:754:128: warning: format ‘%i’ expects type ‘int’, but argument 8 has type ‘long unsigned int’
Run Code Online (Sandbox Code Playgroud)
显然这是我们需要解决的一件坏事,但我只是对忽略这个警告的潜在后果感到好奇吗?结果仅限于日志文件中的输出,还是会导致缓冲区溢出或任何其他类型的情况,我们在不知情的情况下覆盖内存?
根据定义,具有不匹配格式字符串和参数类型的未定义行为.
所以任何事都可以发生.但更有可能的是,你会得到完全乱码和无意义的输出 - 特别是如果你传递的操作数的大小与格式字符串的预期不匹配.
缓冲区溢出可能发生 - 如果printf()最终读取参数,它将读取堆栈垃圾.但它只会阅读它.它不会写入它,所以它不应该腐败任何东西.(有一个例外 - %n,见评论)
但话说回来,它是未定义的行为.一切皆有可能.