C and C++


CONCURRENCY.C_ATOMIC.MO : Risky Atomic Memory Order

Summary

A function call specifies an atomic memory order that is not memory_order_seq_cst.

Checks for this warning class apply to the stdatomic.h functions that have explicit atomic memory order (memory_order) parameters.

Properties

Class Name Risky Atomic Memory Order
Significance reliability
Mnemonic CONCURRENCY.C_ATOMIC.MO
Categories
MisraC2023 MisraC2023:21.25 All memory synchronization operations shall be executed in sequentially consistent order
Misra2012 Misra2012:21.25 All memory synchronization operations shall be executed in sequentially consistent order
CWE CWE:821 Incorrect Synchronization
Availability Available for C and C++.
Enabling Checks for this warning class are disabled by default. To enable them, add the following WARNING_FILTER rule to the project configuration file.
WARNING_FILTER += allow class="Risky Atomic Memory Order"

Example

#include <stdatomic.h>

_Atomic int avar;

void c_atomic_mo( void ) {
    int nvar = 1;

    atomic_init(&avar, nvar+1);

    nvar += atomic_load(&avar);                                  /* ok: atomic_load() uses memory_order_seq_cst implicitly */

    nvar += atomic_load_explicit(&avar, memory_order_seq_cst);   /* ok: call specifies memory_order_seq_cst explicitly */

    /* 'Risky Atomic Memory Order' warning issued on following line
     * - call specifies memory_order_relaxed
     */
    nvar += atomic_load_explicit(&avar, memory_order_relaxed);

    /* 'Risky Atomic Memory Order' warning issued on following line
     * - call specifies memory_order_relaxed
     */
    atomic_store_explicit(&avar, nvar, memory_order_relaxed);
}

Relevant Configuration File Parameters

The following configuration file parameters affect checks for this warning class.