除了-Wall之外,其他人发现的警告有用吗?
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
我看到了编译器选项GNU99和C99.它们的区别是什么?任何细节文件?(Clang,Xcode,Mac OS X)
我在C中实现了一些排序算法(排序整数),小心地uint64_t
用来存储与数据大小有关的任何东西(因此也是计数器和东西),因为算法也应该用几千兆的数据集进行测试整数.
算法应该没问题,并且分配的数据量应该没有问题:数据存储在文件中,我们每次只加载很少的块,即使我们将内存缓冲区扼流到任何大小,一切也能正常工作.
使用高达4千兆字节的数据集进行测试(因此16GB的数据)工作正常(分类4Gint需要2228秒,约37分钟),但是当我们超过那个(即:8 Gints)时算法似乎没有停止(它是现在已经跑了大约16个小时).
我担心问题可能是由于整数溢出,也许循环中的计数器存储在32位变量上,或者我们可能正在调用一些与32位整数一起工作的函数.
还有什么呢?
有没有简单的方法来检查运行时是否发生整数溢出?
编译器通常会提供一个开关,以便在代码无法访问时发出警告.我还看到了一些库的宏,它们为无法访问的代码提供断言.
是否存在提示,例如通过编译指示或内置,我可以传递给GCC(或任何其他编译器),如果确定实际可以达到预期无法访问的行,则会在编译期间发出警告或错误?
这是一个例子:
if (!conf->devpath) {
conf->devpath = arg;
return 0;
} // pass other opts into fuse
else {
return 1;
}
UNREACHABLE_LINE();
Run Code Online (Sandbox Code Playgroud)
这个值的作用是在预期的不可达行之上的条件发生变化之后检测到该行实际上是可达的.
我(很快)编写了一些代码并意外地将参数反转为scanf()
:
char i[] = "ABC1\t";
scanf(i, "%s");
Run Code Online (Sandbox Code Playgroud)
编译gcc -Werror -Wall -Wextra
并没有抱怨这一点.显然,这段代码不起作用,但为什么没有gcc通知我,我颠倒了论点?它不能检测到i
不是格式字符串,或者第二个参数不是可存储类型吗?
编辑
感谢您的洞察力,看起来我找到了答案,-Wformat
旗帜上有一个扭曲,使这个"捕获"(在下面张贴以供参考)
我一直在寻找对C的警告选项的推荐G ++名单++,只有能找到这样的:对于C推荐GCC警告选项和有用的GCC标志对C这些都是非常特定于C
-Wall和-Wextra启用gcc可以生成的大多数但不是全部警告.
哪些选项未启用哪些警告特别是在编译C++时也应该打开?
我正在编译下面的代码
$ gcc -Wall -ftrapv test.c
Run Code Online (Sandbox Code Playgroud)
但是,运行生成的可执行文件总是打印-2147483648,这不是我的预期.我正在运行gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5).
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <limits.h>
4 #include <signal.h>
5
6 void h(int signal)
7 {
8 printf("caught signal exiting\n");
9 exit(1);
10 }
11
12 int main(void)
13 {
14 int x = INT_MAX;
15 int y;
16
17 signal(SIGABRT,h);
18 y = x+1;
19 printf("%d\n",y);
20 return 0;
21 }
Run Code Online (Sandbox Code Playgroud)
稍后添加:使用clang编译并将SIGABRT更改为SIGILL工作,但到目前为止没有运气.
我为我的 C++ 项目使用自定义 make 文件。我正在为发布版本寻找最推荐的编译标志。我目前正在使用以下内容:
CXXFLAGS += -O3 -Wall -DNDEBUG
我认为以上内容就足够了,但后来我尝试在二进制文件上运行“strip”工具,它大大缩小了大小。看起来二进制文件中仍然有一些非必要的东西。
我知道这是一个广泛的主题,但我正在寻找优化(速度和大小)发布版本的通用设置。我知道默认情况下 gcc 甚至不会丢弃死代码——我想尽快弄清楚如何做到这一点。
作为参考,我的 make 设置是https://github.com/YasserAsmi/buildmk
如果我们将c编程中的变量声明为整数而不定义值,则printf会从缓冲区中输出一些垃圾值.有没有办法防止打印垃圾值?
我想检查是否可以在编译时完成某些事情?如果可能的话?