小编mrs*_*ith的帖子

"sizeof(arr [0])"会导致未定义的行为吗?

有一个众所周知的模式来计算数组长度:

int arr[10]; 
size_t len = sizeof(arr) / sizeof(arr[0]); 
assert(len == 10); 
Run Code Online (Sandbox Code Playgroud)

此模式适用于静态数组和常量大小的自动数组.它也适用于C99中的可变长度数组.

我想应用类似的想法来计算动态数组大小(以字节为单位):

size_t known_len = 10; 
int *ptr = malloc(known_len * sizeof(int)); 
size_t size = known_len * sizeof(ptr[0]); 
assert(size == known_len * sizeof(int)); 
Run Code Online (Sandbox Code Playgroud)

这比known_len * sizeof(int)因为sizeof(ptr[0])没有引用实际的数组元素类型更好.因此,它不需要代码的读者知道类型.

然而,我不清楚表达是否sizeof(ptr[0])会导致不确定的行为.随着它扩大:

sizeof(ptr[0]) -> sizeof(*((ptr) + (0))) -> sizeof(*ptr) 
Run Code Online (Sandbox Code Playgroud)

如果ptr是,结果表达式是有问题的0:

sizeof(*((int*) 0)) 
Run Code Online (Sandbox Code Playgroud)

根据C99标准:

(C99,6.3.2.3p3):"带有值的整型常量表达式0,或者这种表达式转换为类型void *,称为空指针常量." 取消引用空指针是未定义的行为.

(C99,6.5.3.2.p4)"如果为指针分配了无效值,则一元运算*符的行为未定义.87)"

87):"一元运算*符解除引用指针的无效值中有一个空指针,一个与指向的对象类型不一致的地址,以及一个对象在其生命周期结束后的地址."

但是从未指明这种表达式的sizeof是否会导致未定义的行为.实际上,应该在编译时评估这样的sizeof.

我的问题是:

  • sizeof(ptr[0])当类型ptr已知并且值ptr …

c arrays sizeof c99 undefined-behavior

16
推荐指数
2
解决办法
883
查看次数

Linux上对共享库的依赖性较弱

我想让我的可执行文件"可选地依赖"其他共享对象.因此,如果DSO不存在,它将能够在没有某些符号的情况下运行.

我可以通过dlopen/dlsym调用实现这一点,但我必须手动加载每个符号并为它们添加包装器,如下所示:

void *my_lib = dlopen("my_lib.so", RTLD_LAZY);  
if (!my_lib)  {
    // ok, I promise not to touch my_lib symbols
} else {
    my_foo_ptr = dlsym(my_lib, "my_foo");
    my_bar_ptr = dlsym(my_lib, "my_bar");
}

... my_foo(...) {
    assert(my_foo_ptr);
    return (*my_foo_ptr)(...);
}

... my_bar(...) {
    assert(my_foo_ptr);
    return (*my_bar_ptr)(...);
}
Run Code Online (Sandbox Code Playgroud)

这是一个愚蠢的代码,它直接依赖于"my_lib.so"ABI,这意味着每次库更新时我都必须更新它.

我正在寻找一些方法来ld.so为我做这件事.所以理想的是:

void *my_lib = dlopen("my_lib.so", /* bring me all my symbols */);  
if (!my_lib)  {
    // ok, I promise not to touch my_lib symbols
} else {
    // ok, I …
Run Code Online (Sandbox Code Playgroud)

c linux ld dlopen

5
推荐指数
1
解决办法
1677
查看次数

标签 统计

c ×2

arrays ×1

c99 ×1

dlopen ×1

ld ×1

linux ×1

sizeof ×1

undefined-behavior ×1