ISO/IEC TS 17961 [padcomp]
Comparison of padding data
Description
Rule Definition
Comparison of padding data.1
Polyspace Implementation
This checker checks for Memory comparison of padding data.
Examples
Memory comparison of padding data
Memory comparison of padding data occurs
when you use the memcmp
function to compare two
structures as a whole. In the process, you compare meaningless data
stored in the structure padding.
For instance:
typedef struct structType { char member1; int member2; //... }myStruct; myStruct var1; myStruct var2; //... if(memcmp(&var1,&var2,sizeof(var1)))//Noncompliant { //... }
If members of a structure have different data types,
your compiler introduces additional padding for data alignment in memory. For an example
of padding, see Higher Estimate of Size of Local Variables
(Polyspace Code Prover).
The content of these extra padding bytes is meaningless. The
C Standard allows the content of these bytes to be indeterminate,
giving different compilers latitude to implement their own padding.
If you perform a byte-by-byte comparison of structures with memcmp
,
you compare even the meaningless data stored in the padding. You might
reach the false conclusion that two data structures are not equal,
even if their corresponding members have the same value.
Instead of comparing two structures in one attempt, compare the structures member by member.
For efficient code, write a function that does the comparison member by member. Use this function for comparing two structures.
You can use memcmp
for byte-by-byte comparison
of structures only if you know that the structures do not contain
padding. Typically, to prevent padding, you use specific attributes
or pragmas such as #pragma pack
. However, these
attributes or pragmas are not supported by all
compilers and make your code implementation-dependent. If your structures
contain bit-fields, using these attributes or pragmas cannot prevent
padding.
memcmp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define fatal_error() abort()
typedef struct s_padding
{
char c;
int i;
unsigned int bf1:1;
unsigned int bf2:2;
unsigned char buffer[20];
} S_Padding ;
/* Function that guarantees safe access to the input memory */
extern int trusted_memory_zone(void *ptr, size_t sz);
int func(const S_Padding *left, const S_Padding *right)
{
if (!trusted_memory_zone((void *)left, sizeof(S_Padding)) ||
!trusted_memory_zone((void *)right, sizeof(S_Padding))) {
fatal_error();
}
if (0 == memcmp(left, right, sizeof(S_Padding)))
{
return 1;
}
else
return 0;
}
In this example, memcmp
compares byte-by-byte
the two structures that left
and right
point
to. Even if the values stored in the structure members are the same,
the comparison can show an inequality if the meaningless values in
the padding bytes are not the same.
One possible correction is to compare individual structure members.
Note
You can compare entire arrays by using memcmp
.
All members of an array have the
same data type. Padding bytes are not required to store arrays.
#include <stdio.h> #include <stdlib.h> #include <string.h> #define fatal_error() abort() typedef struct s_padding { char c; int i; unsigned int bf1:1; unsigned int bf2:2; unsigned char buffer[20]; } S_Padding ; /* Function that guarantees safe access to the input memory */ extern int trusted_memory_zone(void *ptr, size_t sz); int func(const S_Padding *left, const S_Padding *right) { if (!trusted_memory_zone((void *)left, sizeof(S_Padding)) || !trusted_memory_zone((void *)right, sizeof(S_Padding))) { fatal_error(); } return ((left->c == right->c) && (left->i == right->i) && (left->bf1 == right->bf1) && (left->bf2 == right->bf2) && (memcmp(left->buffer, right->buffer, 20) == 0)); }
Check Information
Decidability: Undecidable |
Version History
Introduced in R2019a
1 Extracts from the standard "ISO/IEC TS 17961 Technical Specification - 2013-11-15" are reproduced with the agreement of AFNOR. Only the original and complete text of the standard, as published by AFNOR Editions - accessible via the website www.boutique.afnor.org - has normative value.
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)