@@ -3438,15 +3438,35 @@ void CheckOther::checkOverlappingWrite()
34383438 continue ;
34393439 if (nonOverlappingData->ptr2Arg <= 0 || nonOverlappingData->ptr2Arg > args.size ())
34403440 continue ;
3441- if (nonOverlappingData->sizeArg <= 0 || nonOverlappingData->sizeArg > args.size ())
3441+
3442+ const Token *ptr1 = args[nonOverlappingData->ptr1Arg - 1 ];
3443+ if (ptr1->hasKnownIntValue () && ptr1->getKnownIntValue () == 0 )
3444+ continue ;
3445+
3446+ const Token *ptr2 = args[nonOverlappingData->ptr2Arg - 1 ];
3447+ if (ptr2->hasKnownIntValue () && ptr2->getKnownIntValue () == 0 )
3448+ continue ;
3449+
3450+ // TODO: nonOverlappingData->strlenArg
3451+ if (nonOverlappingData->sizeArg <= 0 || nonOverlappingData->sizeArg > args.size ()) {
3452+ if (nonOverlappingData->sizeArg == -1 ) {
3453+ ErrorPath errorPath;
3454+ const bool macro = true ;
3455+ const bool pure = true ;
3456+ const bool follow = true ;
3457+ if (!isSameExpression (mTokenizer ->isCPP (), macro, ptr1, ptr2, mSettings ->library , pure, follow, &errorPath))
3458+ continue ;
3459+ overlappingWriteFunction (tok);
3460+ }
34423461 continue ;
3462+ }
34433463 if (!args[nonOverlappingData->sizeArg -1 ]->hasKnownIntValue ())
34443464 continue ;
34453465 const Token *buf1, *buf2;
34463466 MathLib::bigint offset1, offset2;
3447- if (!getBufAndOffset (args[nonOverlappingData-> ptr1Arg - 1 ] , &buf1, &offset1))
3467+ if (!getBufAndOffset (ptr1 , &buf1, &offset1))
34483468 continue ;
3449- if (!getBufAndOffset (args[nonOverlappingData-> ptr2Arg - 1 ] , &buf2, &offset2))
3469+ if (!getBufAndOffset (ptr2 , &buf2, &offset2))
34503470 continue ;
34513471
34523472 ErrorPath errorPath;
0 commit comments