This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TMS320VC33:生成的用于循环字符串的汇编代码的两个版本。 一个工作正常、一个不工作

Guru**** 2378650 points
Other Parts Discussed in Thread: TMS320VC33
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/720657/compiler-tms320vc33-two-versions-of-generated-assembly-code-to-loop-string-one-works-one-does-not

器件型号:TMS320VC33

工具/软件:TI C/C++编译器

您好:

遇到编译器问题时、TMS320VC33可能会出现错误。 编译器版本为4.70。  

从两个版本的函数生成的汇编  

SECURITY_NercCompliantPW。  只需检查密码字符串是否有一个上部、一个下部、一个数字和一个特殊字符。
我在 C 语言中附加了两个版本的代码以及生成的汇编文件。
当通过'\0'检查字符串的末尾时、一个工作正常
按长度检查字符串末尾时出现一次失败(结果不正确)。
随附源文件和生成的 asm 文件的一部分
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不再支持 C30编译器。  版本4.70已使用20多年。  如果我们确定了错误、我们将不会修复它。  我们只会告诉您如何解决该问题。  但是、您已经找到了权变措施。  因此、我不确定还需要什么。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的乔治:

    感谢您的反馈。 我了解不再支持该工具链。

    我可以做的是尝试确认它是已知的错误还是在哪种情况下会发生。

    我们在芯片上仍有很多代码在工作、如果我们无法在出现错误时找到模式、程序员很难知道何时使用该变通办法。

    如果您能提供更多信息、我们将不胜感激。

    非常感谢。

    吴耀文
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们将尝试更好地描述导致错误的情况。  但我需要您提供更多信息。

    1. 尽可能减少测试用例
    2. 我们可以构建的测试用例
    3. 构建选项
    4. 发生故障时会发生什么情况

    如果您将测试用例减少、以便仅对问题函数 security_NercCompliantPW 进行一次调用、这将是理想情况。  如果您无法执行此操作、则需要指明失败的呼叫是哪个呼叫。

    我们希望自己构建测试用例。  无法构建您发送的代码、因为它依赖于未提供的多种类型和#define 常量。  两个示例是布尔值和 MAX_NERC_CHECK_LEN。  如果您对代码进行预处理并向我们发送输出、则会更好、而不是猜测这些情况。  和以前一样构建、但添加选项-pl -pn。  这会创建一个与基本文件同名的文件、但扩展名更改为.pp  这是我们需要的预处理文件。  将其附加到下一个帖子。  由于论坛仅接受几种不同的文件类型、因此请在其中添加文件扩展名.txt

    我在您发送的汇编代码中看到这些构建选项...

    ; u:\Tools\Texas \ti\c30\bin\ac30.exe -v31 -q -mr -x -dNDEBUG -dnu_no_error_checking -dcr_inc_status -dcr_inc_rx_msTAG -i\Tools\tex
    ; u:\Tools\Texas \ti\c30\bin\opt30.exe -v31 -q -r -a -O2 C:\Users\224474\AppData\Local\Temp\security.if C:\Users\224474\AppData\
    ; u:\Tools\Texas \ti\c30\bin\cg30.exe -v31 -q -p -a -c -i -a C:\Users\224474\AppData\Local\Temp\security.opc:\Users\224474\AppData\Local\Temp\security.tmp 

    我假设这与您调用编译器的方式完全匹配。  如果不是、则我们需要准确地查看编译器选项、就像编译器看到的那样。

    当代码失败时、您确切地知道吗?  您在看什么?  您期望什么、而您看到了什么?  如果您有任何有关编译器生成的汇编代码不正确位置的信息、请也共享该信息。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    乔治:

    是的、我可以缩小测试用例的范围。 这是一个简单的 API、其本身与其他器件无关。  security_strn 和  security_NercCompliantPW 是我需要验证的所有函数。 我创建了一个名为  security_NercCompliantPW_Test 的单元测试 API。 它将由  security_InitSecurity 调用

    我发现以下代码失败,因为它未通过设备测试,它将通过一个上部、一个下部、一个数字和一个特殊字符的检查。

    /*肯定 情况*/
    if (!security_NercCompliantPW("管理员")、"Wq1#12345")
    return __line__; 

    在.pp 文件第15384行中、我检测以下行的故障。

    if ((1 | 2 | 4 | 8)!= NercFlags)
    {
    return false;
    } 

    生成的 pp 文件是 attached.e2e.ti.com/.../security_5F00_fail.asme2e.ti.com/.../security_5F00_fail.pp.txte2e.ti.com/.../security_5F00_ok.asme2e.ti.com/.../security_5F00_ok.pp.txt


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不确定我是否理解。  我想您说的是,当这个代码执行时...

    if ((1 | 2 | 4 | 8)!=确认标志)
    {
    返回 false;
    }
    

    (笑声) 变量 NercFlags 已设置所有4个标志(它等于0xF)、但返回 false 仍然会执行。 代码不应返回 false、但继续执行下一操作。  这是您看到的内容的正确描述吗?

    我需要更多的细节... 我需要查看传递给编译器 shell 命令 cl30的所有选项、这与您构建时发生的情况完全相同。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的乔治:

    对于测试用例、   

    SECURITY_NercCompliantPW ("管理员"、"Wq1#12345")
    

    它将返回 true。(表示它符合)

    但 NercFlags 不是0x0F (应该是),因此它返回 false (在 security_fail 文件中)。 在 securtiy_fail.asm 中,它看起来 asm 代码进行了奇怪的比较。 然后与值进行比较。 例如、第一次比较为7 (‘a'的 ASCII 为65 < 7+59)。

    (二
    *函数 DEF:_security_NercCompliantPW
    
    _security_NercCompliantPW:
    PUSHR4
    *
    * R3分配给变量 NercFlags
    * AR2分配给变量 R1
    * IR1分配给参数 pUsername
    * BK分配给参数 pPassword
    *
    LDIAR2、IR1
    LDIR2、BK
    CMPI0、IR1
    BZL173
    CMPI0、BZ
    L173
    *、BZ LMPI *>>>>>>>>>>>>>>>>> 输入 strlen()
    LDIBK、AR2
    SUpi1、AR2
    L157:
    LDI*++AR2、R0
    BNZL157
    *<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< leaving strlen()
    subiBK、AR2、R4
    CMPI8、R4
    BLOL173
    CMPI16、R4
    BHIL173
    LDI0、R3
    CMPI0、R4
    BZL172
    LDI59、R0
    SUIR0、BK、AR2
    L162:
    LDI*++AR2、R2
    CMPI7、R2
    BLLT166 L166 CGT
    
    
    
    
    32、
    
    R2 LGT L166
    
    、R170 LGT L166、LGT L166、L160:L166、R72 LGT L170 L170 LGT L166、LGT L160:L166 L160 L160 BLDI L166、LR2 L160 L
    CMPI-10、R2
    BLTL168
    CMPI0、R2
    BGEL168
    或04h、R3
    BL171
    L168:
    CLT-25、R2
    BLTL171
    CMPI-10、R2
    BLTLL37
    CMPI0、R2
    BLTL171
    CMPI6、R2
    BLELL37
    CMPI33、R2
    BL171
    C38、R2 BLT 171 LMPI 0、R2 BLT 171 LMPI 6、R2 BLT
    
    
    
    171 LGT 171 LMPI:0831、
    
    R2 L170 LMPI:r3 LGT、L170 LMPI:L170 LMPI:L170 LGT:L170 LMPI:LGT:
    
    SUI1、R4
    BNZL162
    L172:
    CMPI15、R3
    BNZL173
    LDIBK、AR2
    LDIIR1、R2
    LDI3、R3
    LDI0、RC
    调用_SECURITY_strn
    CMPI0、R0
    BZL174
    L173:
    LDI0、R0
    BEPI0_23
    L174:
    LDI1、R0
    EPIC0、R23
    
    RETS:R0 

    我明天将附加编译器选项。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    整个构建过程为:

    clearmake:输入目录`U:\50325\BUILD2\makefiles'
    echo P545 Courier……
    cd ..\model_Piles \courier & clearmake -f ..\..\makefiles\makefile.mak model_id=545 model_type=curry_diff variant=courier copro main_card
    clearmake:输入目录`U:\50325\BUILD2\model_P545\mak p545\courier'
    p545\building copro_cProcessor main_card clearmake:
    
    up `
    `cobile.cd\clearem_cobile.d\cobile.d\cobile.d\cobile.d\cobi\cobil\cobile.d\cobi\mcobr\cobr\cobil\cobr\mcobile.
    clearmake:离开目录`U:\50325\BUILD2\MODUL_P545\copro'
    
    echo P545-courier:Building Platform release library
    clearmake -e -f .\..\makefiles\platform.mak "Copts="
    clearmake: 输入目录`U:\50325\BUILD2\MODUL_P545\courier'
    \Tools\TExaS ti\c30\bin\cl30.exe -c -v31 -q -MR -mc -mi -mf -o2 -k -dNDEBUG -dnu_no_error_checking -dcr_ti_status -mc -mc -mc -mf -mc -mc -o2 -mf -mf -mf -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mb -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -o2 -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc -mc - -i\50222\DNP3\Slave-SCL-V3 -i\50222\DNP3\Slave-SCL-V3\tmwscl\utils -DC_HAS_SLNK -dPLATFORM_UI -dPLATFORM_FCUR -dCURRENT_DEBUG_ADDR_DR_DR_DR_DR_DR_DB_CL_DEBU_CL_DR_CL_CL_CL_TRIGGERSION_AD_AD_TRIGG\dMP_ADTRIGGER_DMP_AD_AD_TRIGGER_DON_DB_TRIGGER_TRU_AD_TRIGGER_DMP_AD_TRIGGER_AD_TRIGGER_TRIGGER_DAP_DB_AD_TRIGGER_AD_SECUR_TRU_DMP_TRU_TRUTRUTRIGGER_AD_AD_AD_AD_TRUTRUTRUTRIGGER_AD_AD_AD_TRUTRUTRUTRUTRU
    
    
    
    
    
    ```
    clearmake:离开目录`U:\50325\BUILD2\model_P545\courier'
    echo P545-courier: Building Application release version
    clearmake -e -f .....\makefiles\application.hex "Copts="
    clearmake:进入目录`U:\50325\BUILD2\model_P545\hex'
    `是最新的。
    clearmake:离开目录`U:\50325\BUILD2\MODE_P545\courier'
    
    clearmake:离开目录`U:\50325\BUILD2\MODE_P545\courier'
    
    clearmake:离开目录`U:\50325\BUILD2\makefiles'
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我可以对所发生的情况进行部分解释。   

    下面是问题函数中的键循环开始...

    while (索引<长度)
    {
    /*检查大写字符*/
    if (((pPassword[Index]>='A')&&(pPassword[Index]<='Z'))
    {
    NercFlags = NercFlags | NERC_UPLOW_MASK;
    }
    

    我添加了构建选项-s  通知编译器向生成的汇编代码添加注释、这使理解更加容易。  这是键循环开始之前的组合...

    ***-------------- U$27 =&pPassword[-59];
    LDI59、R0
    SUpiR0、BK、AR2
    ** 15360--- L$2 =C$3;
    L162:
    ***---G8:
    ** 15360-------------- 如果((U$28 =*(+U$27))<7)转至 G12;
    

    标签 L162是键循环的开始。  请注意名称 U$27。  这是由编译器的优化器传递自动生成的临时变量名称。  这是要检查的密码字符串的指针。  如何初始化。  应将其初始化为_pPassword[-1]。  即、字符串开头后面的一个字符串。  然后、第一个参考*(++U$27)按预期工作。  但使用的不是-1、而是-59。  

    我不知道编译器的优化器传递为什么会产生此错误。  在这么旧的编译器中、很难确定如此深入的细节。  我希望这种解释足以满足你的目的。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的乔治:

    感谢您澄清这种情况。 它确认了编译器问题的可疑情况。 最后一个问题:这是否是此版本编译器的已知错误?

    此致

    6月  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Roy Wu"]这是此版本编译器的已知错误吗?

    否  乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 George、我们可以关闭这个帖子。