Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
bgColor#ccccff
langc
#include <string.h>
 
enum { STR_SIZE = 32 };
 
size_t func(const char *source) {
  char c_str[STR_SIZE];
  size_t ret = 0;

  if (source) {
    strncpy(c_str, source, sizeof(c_str) - 1);
    c_str[sizeof(c_str) - 1] = '\0';
    ret = strlen(c_str);
  } else {
    /* Handle null pointer */
  }
  return ret;
}

Compliant Solution (

...

The C Standard, Annex K strncpy_s() function can also be used to copy with truncation. The strncpy_s() function copies up to n characters from the source array to a destination array. If no null character was copied from the source array, then the nth position in the destination array is set to a null character, guaranteeing that the resulting string is null-terminated.

Code Block
bgColor#ccccff
langc
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>

enum { STR_SIZE = 32 };

size_t func(const char *source) {
  char c_str[STR_SIZE];
  size_t ret = 0;

  if (source) {
    errno_t err = strncpy_s(
      c_str, sizeof(c_str), source, strnlen(source, sizeof(c_str))
    );
    if (err != 0) {
      /* Handle error */
    } else {
      ret = strnlen(c_str, sizeof(c_str));
    }
  } else {
     /* Handle null pointer */
  }
  return ret;
}

Compliant Solution (Copy without Truncation)

If the programmer's intent is to copy without truncation, this compliant solution copies the data and guarantees that the resulting array is null-terminated. If the string cannot be copied, it is handled as an error condition.

...

Tool

Version

Checker

Description

Astrée
Include Page
Astrée_V
Astrée_V
stdlib-string-termination

Partially checked + soundly supported

Supported

Astrée supports the implementation of library stubs to fully verify this guideline.

Axivion Bauhaus Suite

Include Page
Axivion Bauhaus Suite_V
Axivion Bauhaus Suite_V

CertC-STR32Partially implemented: can detect some violation of the rule
CodeSonar
Include Page
CodeSonar_V
CodeSonar_V
MISC.MEM.NTERM.CSTRINGUnterminated C String
Compass/ROSE



Can detect some violations of this rule

Coverity
Include Page
Coverity_V
Coverity_V
STRING_NULLFully implemented
Cppcheck Premium

Include Page
Cppcheck Premium_V
Cppcheck Premium_V

premium-cert-str32-c
Helix QAC

Include Page
Helix QAC_V
Helix QAC_V

DF2835, DF2836, DF2839


Klocwork
Include Page
Klocwork_V
Klocwork_V

NNTS.MIGHT
NNTS.MUST
SV.STRBO.BOUND_COPY.UNTERM


LDRA tool suite
Include Page
LDRA_V
LDRA_V

404 S, 600 S

Partially implemented

Parasoft C/C++test
Include Page
Parasoft_V
Parasoft_V
CERT_C-STR32-a

Avoid overflow due to reading a not zero terminated string

Polyspace Bug Finder

Include Page
Polyspace Bug Finder_V
Polyspace Bug Finder_V

CERT C: Rule STR32-C


Checks for:

  • Invalid use of standard library string routine
  • Tainted NULL or non-null-terminated string

Rule partially covered.

PVS-Studio

Include Page
PVS-Studio_V
PVS-Studio_V

V692
RuleChecker

Include Page
RuleChecker_V
RuleChecker_V

stdlib-string-terminationPartially checked
Security Reviewer - Static Reviewer

Include Page
Security Reviewer - Static Reviewer_V
Security Reviewer - Static Reviewer_V

shiftTooManyBitsFully implemented
TrustInSoft Analyzer

Include Page
TrustInSoft Analyzer_V
TrustInSoft Analyzer_V

match format and argumentsPartially verified.

...