这是调用 insl 的函数。
void ide_read_buffer(unsigned char channel, unsigned char reg, unsigned int buffer,
unsigned int quads) {
/* WARNING: This code contains a serious bug. The inline assembly trashes ES and
* ESP for all of the code the compiler generates between the inline
* assembly blocks.
*/
if (reg > 0x07 && reg < 0x0C)
ide_write(channel, ATA_REG_CONTROL, 0x80 | channels[channel].nIEN);
asm("pushw %es; movw %ds, %ax; movw %ax, %es");
if (reg < 0x08)
insl(channels[channel].base + reg - 0x00, buffer, quads); …Run Code Online (Sandbox Code Playgroud) 我有以下代码片段:
_nhp_array_char_t intpd_str1;
intpd_str1.length = snprintf(NULL, 0, "You\'re %.*s!", (_nhp_var_str = _nhp_var_you->to_array_char->_nhp_this_anon(_nhp_var_you->to_array_char)).length, _nhp_var_str.buffer);
intpd_str1.buffer = _nhp_malloc(intpd_str1.length + 1);
intpd_str1.responsible_destroyer = NULL;
snprintf(intpd_str1.buffer, intpd_str1.length + 1, "You\'re %.*s!", _nhp_var_str.length, _nhp_var_str.buffer);
Run Code Online (Sandbox Code Playgroud)
调用_nhp_var_you->to_array_char->_nhp_this_anon(_nhp_var_you->to_array_char)应该并且确实返回一个带有length22 的结构以及 的有效值buffer。
然而,该表达式的intpd_str1.length = snprintf...计算结果为 14。然而,在 GDB 中,预先运行赋值表达式,然后读取_nhp_var_str.length返回正确的值 30。
我怀疑一定存在某种形式的未定义行为,尽管我还无法确认这一点,即使在搜索谷歌和SO之后也是如此。我认为,出于某种原因,在评估 时(_nhp_var_str = _nhp_var_you->to_array_char->_nhp_this_anon(_nhp_var_you->to_array_char)).length,它决定生成 的结果_nhp_var_str.length而不为 赋值_nhp_var_str。
仅供参考,代码看起来很混乱,因为它是经过转译的;就编码风格而言,我无能为力来实际改变它。