Error[8]: Undefined offset: 32, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

字符串作为指针或文字传递时,不一致的strcmp()返回值

您最有可能看到编译器优化的结果。如果我们使用上godbolt
GCC的测试代码
,以

-O0
优化级别,我们可以看到它不调用第一种情况
strcmp

movl    $-1, %esi   #,movl    $.LC0, %edi #,movl    
-1
, %eax #,call printf #

由于您使用常量作为strcmp的参数,因此编译器能够执行常量折叠并在编译时调用内在的编译器,

strcmp
然后生成then,而不必
strcmp
在标准库中实现的运行时调用,并且具有不同的实现则可能是更简单的编译时间
strcmp

在第二种情况下,它的确产生了对的调用

call    strcmp  #movl    %eax, %esi  # D.2047,movl    $.LC0, %edi #,movl    
gcc
, %eax #,call printf #

-O1

这与gcc内置有strcmp的事实是一致的,这是

gcc
恒定折叠期间将使用的内容。

如果我们使用

-1
优化级别或更高级别进行
进一步测试,
movl    $-1, %esi   #,movl    $.LC0, %edi #,xorl    %eax, %eax  #call    printf  #movl    $-1, %esi   #,movl    $.LC0, %edi #,xorl    %eax, %eax  #call    printf  #
则可以折叠两种情况,结果将是
a
两种情况:

b

通过启用更多优化选项,优化器不仅可以确定

strcmp
gcc
指向编译时已知的常量,还可以在编译时
builtin标志
针对这种情况计算结果。

我们可以

strcmp
通过使用-fno-
clang
进行构建并观察
-O0
在所有情况下都会生成对的调用,从而确认正在使用内置函数。

-O1
稍有不同,因为它不会完全折叠,
7.21.4.2
但会同时折叠在强调我的上面和上面。

请注意,任何负面结果都是完全一致的,我们可以通过转到C99标准草案

int strcmp(const char *s1, const char *s2);
的strcmp函数( 或小于零 )来看到:

小于

strcmp函数返回一个大于,等于 的字符串 的整数,因此s1指向的字符串大于,等于或

strcmp
s2指向 未签名的char

technosurus指出,将

7.21.1
其指定为将字符串视为由 [+++] 组成,这在C99中已作如下介绍[+++]:

对于本节中的所有功能,每个字符都应被解释为具有无符号字符类型(因此,每个可能的对象表示形式都是有效的并且具有不同的值)。



)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 33, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

字符串作为指针或文字传递时,不一致的strcmp()返回值

您最有可能看到编译器优化的结果。如果我们使用上godbolt
GCC的测试代码
,以

-O0
优化级别,我们可以看到它不调用第一种情况
strcmp

movl    $-1, %esi   #,movl    $.LC0, %edi #,movl    
-1
, %eax #,call printf #

由于您使用常量作为strcmp的参数,因此编译器能够执行常量折叠并在编译时调用内在的编译器,

strcmp
然后生成then,而不必
strcmp
在标准库中实现的运行时调用,并且具有不同的实现则可能是更简单的编译时间
strcmp

在第二种情况下,它的确产生了对的调用

call    strcmp  #movl    %eax, %esi  # D.2047,movl    $.LC0, %edi #,movl    
gcc
, %eax #,call printf #

-O1

这与gcc内置有strcmp的事实是一致的,这是

gcc
恒定折叠期间将使用的内容。

如果我们使用

-1
优化级别或更高级别进行
进一步测试,
movl    $-1, %esi   #,movl    $.LC0, %edi #,xorl    %eax, %eax  #call    printf  #movl    $-1, %esi   #,movl    $.LC0, %edi #,xorl    %eax, %eax  #call    printf  #
则可以折叠两种情况,结果将是
a
两种情况:

b

通过启用更多优化选项,优化器不仅可以确定

strcmp
gcc
指向编译时已知的常量,还可以在编译时
builtin标志
针对这种情况计算结果。

我们可以

strcmp
通过使用-fno-
clang
进行构建并观察
-O0
在所有情况下都会生成对的调用,从而确认正在使用内置函数。

-O1
稍有不同,因为它不会完全折叠,
7.21.4.2
但会同时折叠在强调我的上面和上面。

请注意,任何负面结果都是完全一致的,我们可以通过转到C99标准草案

int strcmp(const char *s1, const char *s2);
的strcmp函数( 或小于零 )来看到:

小于

strcmp函数返回一个大于,等于 的字符串 的整数,因此s1指向的字符串大于,等于或

strcmp
s2指向 未签名的char

technosurus指出,将

7.21.1
其指定为将字符串视为由 组成,这在C99中已作如下介绍[+++]:

对于本节中的所有功能,每个字符都应被解释为具有无符号字符类型(因此,每个可能的对象表示形式都是有效的并且具有不同的值)。



)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
将字符串作为指针或文字传递时,不一致的strcmp()返回值_随笔_内存溢出

将字符串作为指针或文字传递时,不一致的strcmp()返回值

将字符串作为指针或文字传递时,不一致的strcmp()返回值,第1张

字符串作为指针或文字传递时,不一致的strcmp()返回值

您最有可能看到编译器优化的结果。如果我们使用上godbolt
GCC的测试代码
,以

-O0
优化级别,我们可以看到它不调用第一种情况
strcmp

movl    $-1, %esi   #,movl    $.LC0, %edi #,movl    
-1
, %eax #,call printf #

由于您使用常量作为strcmp的参数,因此编译器能够执行常量折叠并在编译时调用内在的编译器,

strcmp
然后生成then,而不必
strcmp
在标准库中实现的运行时调用,并且具有不同的实现则可能是更简单的编译时间
strcmp

在第二种情况下,它的确产生了对的调用

call    strcmp  #movl    %eax, %esi  # D.2047,movl    $.LC0, %edi #,movl    
gcc
, %eax #,call printf #

-O1

这与gcc内置有strcmp的事实是一致的,这是

gcc
恒定折叠期间将使用的内容。

如果我们使用

-1
优化级别或更高级别进行
进一步测试,
movl    $-1, %esi   #,movl    $.LC0, %edi #,xorl    %eax, %eax  #call    printf  #movl    $-1, %esi   #,movl    $.LC0, %edi #,xorl    %eax, %eax  #call    printf  #
则可以折叠两种情况,结果将是
a
两种情况:

b

通过启用更多优化选项,优化器不仅可以确定

strcmp
gcc
指向编译时已知的常量,还可以在编译时
builtin标志
针对这种情况计算结果。

我们可以

strcmp
通过使用-fno-
clang
进行构建并观察
-O0
在所有情况下都会生成对的调用,从而确认正在使用内置函数。

-O1
稍有不同,因为它不会完全折叠,
7.21.4.2
但会同时折叠在强调我的上面和上面。

请注意,任何负面结果都是完全一致的,我们可以通过转到C99标准草案

int strcmp(const char *s1, const char *s2);
的strcmp函数( 或小于零 )来看到:

小于

strcmp函数返回一个大于,等于 的字符串 的整数,因此s1指向的字符串大于,等于或

strcmp
s2指向 未签名的char

technosurus指出,将

7.21.1
其指定为将字符串视为由 组成,这在C99中已作如下介绍:

对于本节中的所有功能,每个字符都应被解释为具有无符号字符类型(因此,每个可能的对象表示形式都是有效的并且具有不同的值)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4972924.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存