是"合法"有没有实际指令的gcc内联asm语句?
例如,是asm声明"合法"?它会引入未定义的行为吗?
int main(){
int *p = something;
asm("":"=m"(p));
return 0;
}
答案 0 :(得分:2)
First
编译没有任何错误,但没有必要:
Last
GCC完全忽略了那个空int main(){
int *p = 0;
asm("":"=m"(p));
return 0;
}
语句。
答案 1 :(得分:0)
在该具体示例中,编译器可以看到asm(即p
)的所有输出都没有被使用过。由于asm不是volatile(并且至少有1个输出),编译器可以在优化期间自由地完全丢弃该语句。
也许值得一提的是,在i386上,所有扩展的asm语句(即带有参数的语句)总是隐式地使用clobber fpsr(浮点标志)和eflags(想想:cc
clobber)。如果语句未被完全丢弃(例如,如果它是易失性的),则此可能有效。如果是这样,最坏的情况是微小效率损失,而不是错误的结果。
总结一下:
p
的值可能是未定义的,因为你说你正在覆盖内容,但你实际上并没有把任何东西放进去。