ロボットの反乱は近いとは思えない。 私たちのチームが組み込み開発者のニーズに合わせて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
&&の代わりに、&を記述する必要があります。
PVS-Studio警告:
V767ループ内の定数インデックスによる「w」配列の要素への疑わしいアクセス。 fsl_dcp.c 946
配列内の同じセルに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
<の代わりに<<を使用する必要があります。 その後、定数は異なる次数の2に等しくなります。
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がそのようなエラーを見つけることを伝える記事を書くつもりです...おっと!