当使用Clang/LLVM (Apple版本6.1.0 (clang-602.0.49) )编译时,目标:x86_64-apple-darwin14.3.0,下面的C代码打印出22。我实际上并不关心C标准,但我想知道是否有一种方法来制造一个标签,使之在-8字节之间抵消,我选择的另一个四字。我希望它能在Mac和Linux上工作。
#include<stdio.h>
long long x = 22;
long long y = 33;
int main(void) {
long long diff = *(&y - 1);
printf("%lld\n
有一些奇怪的代码使用VLA (可变长度数组),这被gcc 4.6视为有效的C (C99,C11):
$ cat a.c
int main(int argc,char**argv)
{
struct args_t{
int a;
int params[argc]; // << Wat?
// VLA in the middle of some struct, between other fields
int b;
} args;
args.b=0;
for(args.a=0
这个问题类似于
我理解,在增加数组指针后删除它是不可能的,因为它失去了要清除多少字节的跟踪。但是,我无法理解为什么动态数组的逐个删除/取消分配也不起作用。
int main()
{
int n = 5;
int *p = new int[n];
for(int i=0;i<n;++i){
delete &p[i];
}
}
我认为这是可行的,但是在clang12.0中,如果指针错误无效,它就会失败。有人能解释原因吗?
我发现(在下面),在编译使用块的代码时,我需要使用-fblocks。
我需要链接到什么库才能让链接器解析_NSConcreteStackBlock?(在Ubuntu9.10 AMD64上。)
chris@chris-desktop:~$ clang ctest.c
ctest.c:3:25: error: blocks support disabled - compile with -fblocks or pick a
deployment target that supports them
void call_a_block(void (^blockptr)(int)) {
最小代码示例:
#include <stdio.h>
int main()
{
const int a = 5;
static int b[a];
return 0;
}
看起来很好,是吧?变量a是常量。也适用于4.4。
gcc -v
gcc version 6.2.1 20160830 (GCC)
gcc 1.c
1.c: In function ‘main’:
1.c:6:16: error: storage size of ‘b’ isn’t constant
static int b[a];
顺便说一句,clang很好地编译了这段代码。
我正在尝试在其文档()中显示的一些示例上执行clang静态分析器(版本3.8)。
我创建了一个小型C程序,如下所示:
// note: requires alpha.security.taint check turned on.
void test() {
char s[] = "abc";
int x = getchar();
char c = s[x]; // warn: index is tainted
}
我正在执行以下命令来分析上面的代码:
/usr/lib/llvm-3.8/bin/scan-build -enable-checker alp
这个函数的返回值是由C标准定义的。
int foo()
{
char buff[128];
// This is the important line:
if ((void*)buff == (void*)(&buff))
return 1;
else
return 0;
}
foo的结果是什么?在gcc和clang上,它将永远是1,但我不认为这是标准所保证的。
我正在尝试将clang格式引入到我们的工作项目(C和C++)中,但是我很难让它以我想要的方式格式化多行DO2评论。
所有评论都采用相同的格式:
/*! @brief Some text
*
* Some more text
*
* @verbatim
*
* A very long line of text that exceeds the clang-format column width but should not be touched
*
* @endverbatim
*/
我希望clang-格式不要让逐字块单独使用,而不是重新流它们。我使用clang格