工具/软件:TI C/C++编译器
您好:
遇到编译器问题时、TMS320VC33可能会出现错误。 编译器版本为4.70。
从两个版本的函数生成的汇编
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.
工具/软件:TI C/C++编译器
您好:
遇到编译器问题时、TMS320VC33可能会出现错误。 编译器版本为4.70。
从两个版本的函数生成的汇编
我们将尝试更好地描述导致错误的情况。 但我需要您提供更多信息。
如果您将测试用例减少、以便仅对问题函数 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。
我不知道编译器的优化器传递为什么会产生此错误。 在这么旧的编译器中、很难确定如此深入的细节。 我希望这种解释足以满足你的目的。
谢谢、此致、
乔治