strcmp(AIX,Linux Redhat)的不同行为

当我们从AIX迁移到Linux Redhat并发现时,我遇到了一些遗留代码 对于strcmp来说,有些奇怪的情况似乎可以在AIX上编译良好,但在Linux上却出现了分段错误

void conv_virgin(char original_number[20],char normalised_number[20],char b_imsi[20]) {
        if(strlen(original_number)<2||strcmp(original_number,""||strlen (b_imsi)<6)==0)
        {
               strcpy(normalised_number,original_number);
               return;
        }
}

对于AIX,该行似乎编译良好,因为共享对象已运行两年以上了

strcmp(original_number,""||strlen (b_imsi)<6)==0

我想念什么? 预期的代码是检查两个字段,现在将其更正为

if(strlen(original_number)<2||strlen (b_imsi)<6)
hanzhengli 回答:strcmp(AIX,Linux Redhat)的不同行为

在if语句中看起来像是错字

if(strlen(original_number)<2||strcmp(original_number,""||strlen (b_imsi)<6)==0)

由于字符串文字strlen (b_imsi)<6的地址从不等于NULL,因此从不评估条件""。因此,仅对逻辑表达式的第一个操作数求值

""||strlen (b_imsi)<6

似乎if语句应写为

if(strlen(original_number)<2||strcmp(original_number,"" ) ||strlen (b_imsi)<6 )

或喜欢(不太可能)

if(strlen(original_number)<2|| strcmp(original_number,"" ) == 0 ||strlen (b_imsi)<6)

在任何情况下,功能都非常糟糕。至少应将其声明为

void conv_virgin( const char original_number[20],char normalised_number[20],const char b_imsi[20]);

或喜欢

void conv_virgin( const char original_number[static 20],char normalised_number[static 20],const char b_imsi[static 20]);
本文链接:https://www.f2er.com/3059686.html

大家都在问