ロボットのエラー:期待と現実

ロボのバグ






ロボットの反乱は近いとは思えない。 私たちのチームが組み込み開発者のニーズに合わせてPVS-Studioコードアナライザーの適応を開始したという事実に関する記事を書き始めました。 まず、KEILとIARをサポートしました。 組み込みデバイスのいくつかのプロジェクトのエラーを見て、共有したい気持ちがいっぱいです。 これを行う最も簡単な方法は、いくつかの写真といくつかのエラー例を示すことです。



それでは、ロボットのバグと何を関連付けますか? 素人の想像力はこの絵を描きます:



待っています






ただし、RT-Threadオペレーティングシステムのコードにこれらのエラーが表示される場合、すべてが異なっていると思います。
RT-ThreadプロジェクトでPVS-Studioコードアナライザーを使用して見つけた最も単純で面白いエラーのいくつか。



RT-Threadは中国のオープンソースIoTオペレーティングシステムであり、強力なスケーラビリティを備えています。たとえば、ARM Cortex-M0、Cortex-M3 / 4/7などの小さなコアで実行される小さなカーネルから、実行される豊富な機能システムまで、 MIPS32、ARM Cortex-A8、ARM Cortex-A9 DualCoreなど github.com/RT-Thread/rt-thread



PVS-Studioの警告:



V560 CWE-571条件式の一部は常に真です:0xFFFF0000。 peci.c 372

V560 CWE-571条件式の一部は常に真です:0x0000FFFF。 peci.c 373



#define PECI_M0D0C_HITHR_M 0xFFFF0000 // High Threshold #define PECI_M0D0C_LOTHR_M 0x0000FFFF // Low Threshold void PECIDomainConfigGet(....) { unsigned long ulTemp; .... ulTemp = HWREG(ulBase + PECI_O_M0D0C + (ulDomain * 4)); *pulHigh = ((ulTemp && PECI_M0D0C_HITHR_M) >> PECI_M0D0C_HITHR_S); *pulLow = ((ulTemp && PECI_M0D0C_LOTHR_M) >> PECI_M0D0C_LOTHR_S); }
      
      





&&の代わりに、&を記述する必要があります。



PVS-Studio警告:

V767ループ内の定数インデックスによる「w」配列の要素への疑わしいアクセス。 fsl_dcp.c 946



 typedef union _dcp_hash_block { uint32_t w[DCP_HASH_BLOCK_SIZE / 4]; uint8_t b[DCP_HASH_BLOCK_SIZE]; } dcp_hash_block_t; typedef struct _dcp_hash_ctx_internal { dcp_hash_block_t blk; .... } dcp_hash_ctx_internal_t; status_t DCP_HASH_Init(DCP_Type *base, dcp_handle_t *handle, dcp_hash_ctx_t *ctx, dcp_hash_algo_t algo) { .... dcp_hash_ctx_internal_t *ctxInternal; .... for (i = 0; i < sizeof(ctxInternal->blk.w) / sizeof(ctxInternal->blk.w[0]); i++) { ctxInternal->blk.w[0] = 0u; } .... }
      
      





配列内の同じセルに0を書き込みます。 ほとんどの配列は初期化されません。 それは書かれるべきです:



ctxInternal-> blk.w [i] = 0u;



PVS-Studioの警告:



V602 CWE-480「(1U <1)」式の検査を検討してください。 「<」は、おそらく「<<」に置き換える必要があります。 fsl_aipstz.h 69

V602 CWE-480「(1U <2)」式の検査を検討してください。 「<」は、おそらく「<<」に置き換える必要があります。 fsl_aipstz.h 70

V602 CWE-480「(1U <2)」式の検査を検討してください。 「<」は、おそらく「<<」に置き換える必要があります。 fsl_aipstz.h 71



 typedef enum _aipstz_peripheral_access_control { kAIPSTZ_PeripheralAllowUntrustedMaster = 1U, kAIPSTZ_PeripheralWriteProtected = (1U < 1), kAIPSTZ_PeripheralRequireSupervisor = (1U < 2), kAIPSTZ_PeripheralAllowBufferedWrite = (1U < 2) } aipstz_peripheral_access_control_t;
      
      





<の代わりに<<を使用する必要があります。 その後、定数は異なる次数の2に等しくなります。



ターミネーターが警察署に到着してサラコナーを殺すと、次のようになります。



現実






それで、あなたが平和に眠ることができる間。



...



待って、私はPVS-Studioがそのようなエラーを見つけることを伝える記事を書くつもりです...おっと!



All Articles