diff --git a/amendments.csv b/amendments.csv
index 6049525515..e4e5fa4144 100644
--- a/amendments.csv
+++ b/amendments.csv
@@ -11,21 +11,21 @@ c,MISRA-C-2012,Amendment3,RULE-10-7,Yes,Refine,Yes,Import
 c,MISRA-C-2012,Amendment3,RULE-10-8,Yes,Refine,Yes,Import
 c,MISRA-C-2012,Amendment3,RULE-21-11,Yes,Clarification,Yes,Import
 c,MISRA-C-2012,Amendment3,RULE-21-12,Yes,Replace,No,Easy
-c,MISRA-C-2012,Amendment4,RULE-11-3,Yes,Expand,No,Easy
-c,MISRA-C-2012,Amendment4,RULE-11-8,Yes,Expand,No,Easy
-c,MISRA-C-2012,Amendment4,RULE-13-2,Yes,Expand,No,Very Hard
+c,MISRA-C-2012,Amendment4,RULE-11-3,Yes,Expand,Yes,Easy
+c,MISRA-C-2012,Amendment4,RULE-11-8,Yes,Expand,Yes,Easy
+c,MISRA-C-2012,Amendment4,RULE-13-2,Yes,Expand,Yes,Very Hard
 c,MISRA-C-2012,Amendment4,RULE-18-6,Yes,Expand,No,Medium
 c,MISRA-C-2012,Amendment4,RULE-18-8,Yes,Split,Yes,Easy
 c,MISRA-C-2012,Amendment4,RULE-2-2,Yes,Clarification,Yes,Import
 c,MISRA-C-2012,Amendment4,RULE-2-7,Yes,Clarification,Yes,Import
-c,MISRA-C-2012,Amendment4,RULE-3-1,Yes,Refine,No,Easy
+c,MISRA-C-2012,Amendment4,RULE-3-1,Yes,Refine,Yes,Easy
 c,MISRA-C-2012,Amendment4,RULE-8-6,Yes,Clarification,Yes,Import
 c,MISRA-C-2012,Amendment4,RULE-8-9,Yes,Clarification,Yes,Import
 c,MISRA-C-2012,Amendment4,RULE-9-4,Yes,Clarification,Yes,Import
 c,MISRA-C-2012,Amendment4,RULE-10-1,Yes,Clarification,Yes,Import
 c,MISRA-C-2012,Amendment4,RULE-18-3,Yes,Clarification,Yes,Import
 c,MISRA-C-2012,Amendment4,RULE-1-4,Yes,Replace,No,Easy
-c,MISRA-C-2012,Amendment4,RULE-9-1,Yes,Refine,No,Easy
+c,MISRA-C-2012,Amendment4,RULE-9-1,Yes,Refine,Yes,Easy
 c,MISRA-C-2012,Amendment4,RULE-9-2,Yes,Refine,No,Import
 c,MISRA-C-2012,Corrigendum2,DIR-4-10,Yes,Clarification,Yes,Import
 c,MISRA-C-2012,Corrigendum2,RULE-7-4,Yes,Refine,No,Easy
diff --git a/c/common/test/rules/readofuninitializedmemory/test.c b/c/common/test/rules/readofuninitializedmemory/test.c
index ce2c60484e..e76c5a22b3 100644
--- a/c/common/test/rules/readofuninitializedmemory/test.c
+++ b/c/common/test/rules/readofuninitializedmemory/test.c
@@ -94,4 +94,6 @@ void test_non_default_init() {
   static struct A ss;
   use_struct_A(
       ss); // COMPLIANT - static struct type variables are zero initialized
+  _Atomic int x;
+  use_int(x); // COMPLIANT - atomics are special, covered by other rules
 }
\ No newline at end of file
diff --git a/c/misra/src/rules/RULE-11-3/CastBetweenObjectPointerAndDifferentObjectType.ql b/c/misra/src/rules/RULE-11-3/CastBetweenObjectPointerAndDifferentObjectType.ql
index 8292bd3b6f..c51ecbc81d 100644
--- a/c/misra/src/rules/RULE-11-3/CastBetweenObjectPointerAndDifferentObjectType.ql
+++ b/c/misra/src/rules/RULE-11-3/CastBetweenObjectPointerAndDifferentObjectType.ql
@@ -23,7 +23,11 @@ where
   baseTypeFrom = cast.getExpr().getType().(PointerToObjectType).getBaseType() and
   baseTypeTo = cast.getType().(PointerToObjectType).getBaseType() and
   // exception: cast to a char, signed char, or unsigned char is permitted
-  not baseTypeTo.stripType() instanceof CharType and
+  not (
+    baseTypeTo.stripType() instanceof CharType and
+    // Exception does not apply to _Atomic types
+    not baseTypeFrom.hasSpecifier("atomic")
+  ) and
   (
     (
       baseTypeFrom.isVolatile() and not baseTypeTo.isVolatile()
diff --git a/c/misra/src/rules/RULE-11-8/CastRemovesConstOrVolatileQualification.ql b/c/misra/src/rules/RULE-11-8/CastRemovesConstOrVolatileQualification.ql
index 17b12aaf99..c0f447d5b5 100644
--- a/c/misra/src/rules/RULE-11-8/CastRemovesConstOrVolatileQualification.ql
+++ b/c/misra/src/rules/RULE-11-8/CastRemovesConstOrVolatileQualification.ql
@@ -24,5 +24,9 @@ where
     baseTypeFrom.isVolatile() and not baseTypeTo.isVolatile() and qualificationName = "volatile"
     or
     baseTypeFrom.isConst() and not baseTypeTo.isConst() and qualificationName = "const"
+    or
+    baseTypeFrom.hasSpecifier("atomic") and
+    not baseTypeTo.hasSpecifier("atomic") and
+    qualificationName = "atomic"
   )
 select cast, "Cast of pointer removes " + qualificationName + " qualification from its base type."
diff --git a/c/misra/src/rules/RULE-13-2/UnsequencedAtomicReads.ql b/c/misra/src/rules/RULE-13-2/UnsequencedAtomicReads.ql
new file mode 100644
index 0000000000..b5e17fc934
--- /dev/null
+++ b/c/misra/src/rules/RULE-13-2/UnsequencedAtomicReads.ql
@@ -0,0 +1,91 @@
+/**
+ * @id c/misra/unsequenced-atomic-reads
+ * @name RULE-13-2: The value of an atomic variable shall not depend on the evaluation order of interleaved threads
+ * @description The value of an atomic variable shall not depend on evaluation order and
+ *              interleaving of threads.
+ * @kind problem
+ * @precision very-high
+ * @problem.severity error
+ * @tags external/misra/id/rule-13-2
+ *       correctness
+ *       external/misra/c/2012/amendment3
+ *       external/misra/obligation/required
+ */
+
+import cpp
+import semmle.code.cpp.dataflow.TaintTracking
+import codingstandards.c.misra
+import codingstandards.c.Ordering
+import codingstandards.c.orderofevaluation.VariableAccessOrdering
+
+class AtomicAccessInFullExpressionOrdering extends Ordering::Configuration {
+  AtomicAccessInFullExpressionOrdering() { this = "AtomicAccessInFullExpressionOrdering" }
+
+  override predicate isCandidate(Expr e1, Expr e2) {
+    exists(AtomicVariableAccess a, AtomicVariableAccess b, FullExpr e | a = e1 and b = e2 |
+      a.getTarget() = b.getTarget() and
+      a.(ConstituentExpr).getFullExpr() = e and
+      b.(ConstituentExpr).getFullExpr() = e and
+      not a = b
+    )
+  }
+}
+
+/**
+ * A read of a variable specified as `_Atomic`.
+ *
+ * Note, it may be accessed directly, or by passing its address into the std atomic functions.
+ */
+class AtomicVariableAccess extends VariableAccess {
+  AtomicVariableAccess() { getTarget().getType().hasSpecifier("atomic") }
+
+  /* Get the `atomic_<read|write>()` call this VarAccess occurs in. */
+  FunctionCall getAtomicFunctionCall() {
+    exists(AddressOfExpr addrParent, FunctionCall fc |
+      fc.getTarget().getName().matches("__c11_atomic%") and
+      addrParent = fc.getArgument(0) and
+      addrParent.getAnOperand() = this and
+      result = fc
+    )
+  }
+
+  /**
+   * Gets an assigned expr, either in the form `x = <result>` or `atomic_store(&x, <result>)`.
+   */
+  Expr getAnAssignedExpr() {
+    result = getAtomicFunctionCall().getArgument(1)
+    or
+    exists(AssignExpr assign |
+      assign.getLValue() = this and
+      result = assign.getRValue()
+    )
+  }
+
+  /**
+   * Gets the expression holding this variable access, either in the form `x` or `atomic_read(&x)`.
+   */
+  Expr getARead() {
+    result = getAtomicFunctionCall()
+    or
+    result = this
+  }
+}
+
+from
+  AtomicAccessInFullExpressionOrdering config, FullExpr e, Variable v, AtomicVariableAccess va1,
+  AtomicVariableAccess va2
+where
+  not isExcluded(e, SideEffects3Package::unsequencedAtomicReadsQuery()) and
+  e = va1.(ConstituentExpr).getFullExpr() and
+  config.isUnsequenced(va1, va2) and
+  v = va1.getTarget() and
+  v = va2.getTarget() and
+  // Exclude cases where the variable is assigned a value tainted by the other variable access.
+  not exists(Expr write |
+    write = va1.getAnAssignedExpr() and
+    TaintTracking::localTaint(DataFlow::exprNode(va2.getARead()), DataFlow::exprNode(write))
+  ) and
+  // Impose an ordering, show the first access.
+  va1.getLocation().isBefore(va2.getLocation(), _)
+select e, "Atomic variable $@ has a $@ that is unsequenced with $@.", v, v.getName(), va1,
+  "previous read", va2, "another read"
diff --git a/c/misra/src/rules/RULE-3-1/CharacterSequencesAndUsedWithinAComment.ql b/c/misra/src/rules/RULE-3-1/CharacterSequencesAndUsedWithinAComment.ql
index 6eb605dbd9..af05bfe4bc 100644
--- a/c/misra/src/rules/RULE-3-1/CharacterSequencesAndUsedWithinAComment.ql
+++ b/c/misra/src/rules/RULE-3-1/CharacterSequencesAndUsedWithinAComment.ql
@@ -16,27 +16,38 @@
 import cpp
 import codingstandards.c.misra
 
-class IllegalCCommentCharacter extends string {
-  IllegalCCommentCharacter() {
-    this = "/*" or
-    this = "//"
-  }
+/* Character sequence is banned from all comment types */
+class IllegalCommentSequence extends string {
+  IllegalCommentSequence() { this = "/*" }
 }
 
-class IllegalCPPCommentCharacter extends string {
-  IllegalCPPCommentCharacter() { this = "/*" }
+/* A regexp to check for illegal C-style comments */
+class IllegalCCommentRegexp extends string {
+  IllegalCCommentRegexp() {
+    // Regexp to match "//" in C-style comments, which do not appear to be URLs. General format
+    // uses negative lookahead/lookbehind to match like `.*(?<!HTTP:)//(?!GITHUB.).*`. Broken down
+    // into parts:
+    //  - `.*PATTERN.*` - look for the pattern anywhere in the comment.
+    //  - `(?<![a-zA-Z]:)` - negative lookbehind, exclude "http://github.com" by seeing "p:".
+    //  - `//` - the actual illegal sequence.
+    //  - `(?!(pattern))` - negative lookahead, exclude "http://github.com" by seeing "github.".
+    //  - `[a-zA-Z0-9\\-]+\\\\.` - Assume alphanumeric/hyphen followed by '.' is a domain name.
+    this = ".*(?<![a-zA-Z]:)//(?![a-zA-Z0-9\\-]+\\\\.).*"
+  }
+
+  string getDescription() { result = "//" }
 }
 
 from Comment comment, string illegalSequence
 where
   not isExcluded(comment, SyntaxPackage::characterSequencesAndUsedWithinACommentQuery()) and
   (
-    exists(IllegalCCommentCharacter c | illegalSequence = c |
-      comment.(CStyleComment).getContents().indexOf(illegalSequence) > 0
+    exists(IllegalCommentSequence c | illegalSequence = c |
+      comment.getContents().indexOf(illegalSequence) > 1
     )
     or
-    exists(IllegalCPPCommentCharacter c | illegalSequence = c |
-      comment.(CppStyleComment).getContents().indexOf(illegalSequence) > 0
+    exists(IllegalCCommentRegexp c | illegalSequence = c.getDescription() |
+      comment.(CStyleComment).getContents().regexpMatch(c)
     )
   )
 select comment, "Comment contains an illegal sequence '" + illegalSequence + "'"
diff --git a/c/misra/test/rules/RULE-11-3/CastBetweenObjectPointerAndDifferentObjectType.expected b/c/misra/test/rules/RULE-11-3/CastBetweenObjectPointerAndDifferentObjectType.expected
index 94cf6ee635..24e6c4d5af 100644
--- a/c/misra/test/rules/RULE-11-3/CastBetweenObjectPointerAndDifferentObjectType.expected
+++ b/c/misra/test/rules/RULE-11-3/CastBetweenObjectPointerAndDifferentObjectType.expected
@@ -6,3 +6,7 @@
 | test.c:21:3:21:16 | (int *)... | Cast performed between a pointer to object type (char) and a pointer to a different object type (int). |
 | test.c:22:20:22:21 | (int *)... | Cast performed between a pointer to object type (char) and a pointer to a different object type (int). |
 | test.c:23:3:23:18 | (long long *)... | Cast performed between a pointer to object type (int) and a pointer to a different object type (long long). |
+| test.c:26:3:26:13 | (char *)... | Cast performed between a pointer to object type (_Atomic(int)) and a pointer to a different object type (char). |
+| test.c:27:8:27:10 | (char *)... | Cast performed between a pointer to object type (_Atomic(int)) and a pointer to a different object type (char). |
+| test.c:28:3:28:21 | (_Atomic(char) *)... | Cast performed between a pointer to object type (_Atomic(int)) and a pointer to a different object type (_Atomic(char)). |
+| test.c:29:23:29:25 | (_Atomic(char) *)... | Cast performed between a pointer to object type (_Atomic(int)) and a pointer to a different object type (_Atomic(char)). |
diff --git a/c/misra/test/rules/RULE-11-3/test.c b/c/misra/test/rules/RULE-11-3/test.c
index 4730aeac03..0d91740438 100644
--- a/c/misra/test/rules/RULE-11-3/test.c
+++ b/c/misra/test/rules/RULE-11-3/test.c
@@ -21,4 +21,10 @@ void f1(void) {
   (int *const)v2;             // NON_COMPLIANT
   int *const v10 = v2;        // NON_COMPLIANT
   (long long *)v10;           // NON_COMPLIANT
+
+  _Atomic int *v11 = 0;
+  (char *)v11;             // NON_COMPLIANT
+  v2 = v11;                // NON_COMPLIANT
+  (_Atomic char *)v11;     // NON_COMPLIANT
+  _Atomic char *v12 = v11; // NON_COMPLIANT
 }
\ No newline at end of file
diff --git a/c/misra/test/rules/RULE-11-8/CastRemovesConstOrVolatileQualification.expected b/c/misra/test/rules/RULE-11-8/CastRemovesConstOrVolatileQualification.expected
index 48658e2176..aa7752d28a 100644
--- a/c/misra/test/rules/RULE-11-8/CastRemovesConstOrVolatileQualification.expected
+++ b/c/misra/test/rules/RULE-11-8/CastRemovesConstOrVolatileQualification.expected
@@ -1,2 +1,6 @@
 | test.c:4:19:4:33 | (const char *)... | Cast of pointer removes volatile qualification from its base type. |
 | test.c:6:13:6:21 | (char *)... | Cast of pointer removes const qualification from its base type. |
+| test.c:9:3:9:11 | (char *)... | Cast of pointer removes atomic qualification from its base type. |
+| test.c:10:7:10:7 | (char *)... | Cast of pointer removes atomic qualification from its base type. |
+| test.c:11:3:11:17 | (const char *)... | Cast of pointer removes atomic qualification from its base type. |
+| test.c:12:7:12:7 | (const char *)... | Cast of pointer removes atomic qualification from its base type. |
diff --git a/c/misra/test/rules/RULE-11-8/test.c b/c/misra/test/rules/RULE-11-8/test.c
index 75c7fc189a..e0e3b3a2fb 100644
--- a/c/misra/test/rules/RULE-11-8/test.c
+++ b/c/misra/test/rules/RULE-11-8/test.c
@@ -5,5 +5,12 @@ int f1(void) {
   const char *c2 = (const char *)c;                  // COMPLIANT
   char *d = (char *)c;                               // NON_COMPLIANT
   const char *e = (const char *)d;                   // COMPLIANT
+  _Atomic char *f = 0;
+  (char *)f;               // NON_COMPLIANT
+  d = f;                   // NON_COMPLIANT
+  (const char *)f;         // NON_COMPLIANT
+  e = f;                   // NON_COMPLIANT
+  (const _Atomic char *)f; // COMPLIANT
+  (const _Atomic char *)f; // COMPLIANT
   return 0;
 }
\ No newline at end of file
diff --git a/c/misra/test/rules/RULE-13-2/UnsequencedAtomicReads.expected b/c/misra/test/rules/RULE-13-2/UnsequencedAtomicReads.expected
new file mode 100644
index 0000000000..897dd68f30
--- /dev/null
+++ b/c/misra/test/rules/RULE-13-2/UnsequencedAtomicReads.expected
@@ -0,0 +1,5 @@
+WARNING: module 'DataFlow' has been deprecated and may be removed in future (UnsequencedAtomicReads.ql:86,31-39)
+WARNING: module 'DataFlow' has been deprecated and may be removed in future (UnsequencedAtomicReads.ql:86,67-75)
+WARNING: module 'TaintTracking' has been deprecated and may be removed in future (UnsequencedAtomicReads.ql:86,5-18)
+| test.c:44:12:44:18 | ... + ... | Atomic variable $@ has a $@ that is unsequenced with $@. | test.c:42:15:42:16 | a1 | a1 | test.c:44:12:44:13 | a1 | previous read | test.c:44:17:44:18 | a1 | another read |
+| test.c:46:3:46:37 | ... + ... | Atomic variable $@ has a $@ that is unsequenced with $@. | test.c:42:15:42:16 | a1 | a1 | test.c:46:16:46:17 | a1 | previous read | test.c:46:35:46:36 | a1 | another read |
diff --git a/c/misra/test/rules/RULE-13-2/UnsequencedAtomicReads.qlref b/c/misra/test/rules/RULE-13-2/UnsequencedAtomicReads.qlref
new file mode 100644
index 0000000000..46242df1b0
--- /dev/null
+++ b/c/misra/test/rules/RULE-13-2/UnsequencedAtomicReads.qlref
@@ -0,0 +1 @@
+rules/RULE-13-2/UnsequencedAtomicReads.ql
\ No newline at end of file
diff --git a/c/misra/test/rules/RULE-13-2/UnsequencedSideEffects.expected b/c/misra/test/rules/RULE-13-2/UnsequencedSideEffects.expected
index 75bd8169ba..b6c704322c 100644
--- a/c/misra/test/rules/RULE-13-2/UnsequencedSideEffects.expected
+++ b/c/misra/test/rules/RULE-13-2/UnsequencedSideEffects.expected
@@ -1,6 +1,6 @@
-| test.c:6:12:6:18 | ... + ... | The expression contains unsequenced $@ to $@ and $@ to $@. | test.c:6:12:6:13 | l1 | side effect | test.c:6:12:6:13 | l1 | l1 | test.c:6:17:6:18 | l1 | side effect | test.c:6:17:6:18 | l1 | l1 |
-| test.c:7:12:7:18 | ... + ... | The expression contains unsequenced $@ to $@ and $@ to $@. | test.c:7:12:7:13 | l1 | side effect | test.c:7:12:7:13 | l1 | l1 | test.c:7:17:7:18 | l2 | side effect | test.c:7:17:7:18 | l2 | l2 |
-| test.c:17:3:17:21 | ... = ... | The expression contains unsequenced $@ to $@ and $@ to $@. | test.c:17:8:17:9 | l1 | side effect | test.c:17:8:17:9 | l1 | l1 | test.c:17:13:17:14 | l1 | side effect | test.c:17:13:17:14 | l1 | l1 |
-| test.c:19:3:19:5 | call to foo | The expression contains unsequenced $@ to $@ and $@ to $@. | test.c:19:7:19:8 | l1 | side effect | test.c:19:7:19:8 | l1 | l1 | test.c:19:11:19:12 | l2 | side effect | test.c:19:11:19:12 | l2 | l2 |
-| test.c:25:3:25:5 | call to foo | The expression contains unsequenced $@ to $@ and $@ to $@. | test.c:25:7:25:10 | ... ++ | side effect | test.c:25:7:25:8 | l8 | l8 | test.c:25:13:25:14 | l8 | read | test.c:25:13:25:14 | l8 | l8 |
-| test.c:35:5:35:13 | ... = ... | The expression contains unsequenced $@ to $@ and $@ to $@. | test.c:35:10:35:12 | ... ++ | side effect | test.c:35:10:35:10 | i | i | test.c:35:10:35:12 | ... ++ | side effect | test.c:35:10:35:10 | i | i |
\ No newline at end of file
+| test.c:8:12:8:18 | ... + ... | The expression contains unsequenced $@ to $@ and $@ to $@. | test.c:8:12:8:13 | l1 | side effect | test.c:8:12:8:13 | l1 | l1 | test.c:8:17:8:18 | l1 | side effect | test.c:8:17:8:18 | l1 | l1 |
+| test.c:9:12:9:18 | ... + ... | The expression contains unsequenced $@ to $@ and $@ to $@. | test.c:9:12:9:13 | l1 | side effect | test.c:9:12:9:13 | l1 | l1 | test.c:9:17:9:18 | l2 | side effect | test.c:9:17:9:18 | l2 | l2 |
+| test.c:19:3:19:21 | ... = ... | The expression contains unsequenced $@ to $@ and $@ to $@. | test.c:19:8:19:9 | l1 | side effect | test.c:19:8:19:9 | l1 | l1 | test.c:19:13:19:14 | l1 | side effect | test.c:19:13:19:14 | l1 | l1 |
+| test.c:21:3:21:5 | call to foo | The expression contains unsequenced $@ to $@ and $@ to $@. | test.c:21:7:21:8 | l1 | side effect | test.c:21:7:21:8 | l1 | l1 | test.c:21:11:21:12 | l2 | side effect | test.c:21:11:21:12 | l2 | l2 |
+| test.c:27:3:27:5 | call to foo | The expression contains unsequenced $@ to $@ and $@ to $@. | test.c:27:7:27:10 | ... ++ | side effect | test.c:27:7:27:8 | l8 | l8 | test.c:27:13:27:14 | l8 | read | test.c:27:13:27:14 | l8 | l8 |
+| test.c:37:5:37:13 | ... = ... | The expression contains unsequenced $@ to $@ and $@ to $@. | test.c:37:10:37:12 | ... ++ | side effect | test.c:37:10:37:10 | i | i | test.c:37:10:37:12 | ... ++ | side effect | test.c:37:10:37:10 | i | i |
diff --git a/c/misra/test/rules/RULE-13-2/test.c b/c/misra/test/rules/RULE-13-2/test.c
index 1bebec3775..e1be53a037 100644
--- a/c/misra/test/rules/RULE-13-2/test.c
+++ b/c/misra/test/rules/RULE-13-2/test.c
@@ -1,3 +1,5 @@
+#include <stdatomic.h>
+
 void foo(int, int);
 
 void unsequenced_sideeffects1() {
@@ -34,4 +36,15 @@ void unsequenced_sideeffects2() {
   for (i = 0; i < 10; i++) {
     test(i++); // NON_COMPLIANT
   }
+}
+
+void atomics() {
+  _Atomic int a1, a2;
+  int l3 = a1 + a2;                    // COMPLIANT
+  int l4 = a1 + a1;                    // NON_COMPLIANT
+  a1 = a1 + 1;                         // COMPLIANT
+  atomic_load(&a1) + atomic_load(&a1); // NON_COMPLIANT
+  atomic_load(&a1) + atomic_load(&a2); // COMPLIANT
+  atomic_store(&a1, atomic_load(&a1)); // COMPLIANT
+  atomic_store(&a1, a1);               // COMPLIANT
 }
\ No newline at end of file
diff --git a/c/misra/test/rules/RULE-3-1/CharacterSequencesAndUsedWithinAComment.expected b/c/misra/test/rules/RULE-3-1/CharacterSequencesAndUsedWithinAComment.expected
index 5e876cecc3..3c4cab00b1 100644
--- a/c/misra/test/rules/RULE-3-1/CharacterSequencesAndUsedWithinAComment.expected
+++ b/c/misra/test/rules/RULE-3-1/CharacterSequencesAndUsedWithinAComment.expected
@@ -1,3 +1,6 @@
 | test.c:9:1:9:8 | /* /* */ | Comment contains an illegal sequence '/*' |
 | test.c:12:1:12:8 | /* // */ | Comment contains an illegal sequence '//' |
 | test.c:21:1:21:7 | //  /*  | Comment contains an illegal sequence '/*' |
+| test.c:30:1:30:27 | /* https://github.com // */ | Comment contains an illegal sequence '//' |
+| test.c:33:1:33:60 | /* a://b, a://b., ://a.b, a://b., a://.b, ://, a://, ://b */ | Comment contains an illegal sequence '//' |
+| test.c:42:1:42:8 | ///* foo | Comment contains an illegal sequence '/*' |
diff --git a/c/misra/test/rules/RULE-3-1/test.c b/c/misra/test/rules/RULE-3-1/test.c
index c1a135f972..fd7a6574dd 100644
--- a/c/misra/test/rules/RULE-3-1/test.c
+++ b/c/misra/test/rules/RULE-3-1/test.c
@@ -20,4 +20,25 @@
 // NON_COMPLIANT
 //  /* 
 
+// COMPLIANT
+/* https://github.com */
+
+// COMPLIANT
+/* https://name-with-hyphen-and-num-12345.com */
+
+// NON_COMPLIANT
+/* https://github.com // */
+
+// NON_COMPLIANT
+/* a://b, a://b., ://a.b, a://b., a://.b, ://, a://, ://b */
+
+// COMPLIANT
+// https://github.com
+
+// COMPLIANT
+//* foo
+
+// NON_COMPLIANT
+///* foo
+
 void f(){}
\ No newline at end of file
diff --git a/change_notes/2024-12-13-implement-misra-c-amendment4-rule-amendments.md b/change_notes/2024-12-13-implement-misra-c-amendment4-rule-amendments.md
new file mode 100644
index 0000000000..b168ccaf78
--- /dev/null
+++ b/change_notes/2024-12-13-implement-misra-c-amendment4-rule-amendments.md
@@ -0,0 +1,11 @@
+ - `RULE-11-3` - `CastBetweenObjectPointerAndDifferentObjectType.ql`
+   - Constrain exception that pointer types to may be cast to char types, so that it does not apply to atomic pointer types, in compliance with MISRA-C 2012 Amendment 4.
+ - `RULE-11-8` - `CastRemovesConstOrVolatileQualification.ql`
+   - Query expanded to detect cases of removing `_Atomic` qualification, in compliance with MISRA-C 2012 Amendment 4.
+ - `EXP33-C`, `RULE-9-1`, `A8-5-0`, `EXP53-CPP` - `DoNotReadUninitializedMemory.ql`, `ObjectWithAutoStorageDurationReadBeforeInit.ql`, `MemoryNotInitializedBeforeItIsRead.ql`, `DoNotReadUninitializedMemory.ql`
+   - Atomic local variables excluded from query results, in compliance with MISRA-C 2012 Amendment 4, and to reduce false positives in the other standards.
+ - `RULE-13-2` - `UnsequencedAtomicReads.ql`
+   - New query to find expressions which read an atomic variable more than once between sequence points, to address new case from MISRA-C 2012 Amendment 4.
+ - `RULE-3-1` - `CharacterSequencesAndUsedWithinAComment.ql`
+   - Add exception allowing URLs inside of cpp-style `/* ... */` comments, in compliance with MISRA-C 2012 Amendment 4.
+   - No longer report cases of `//*some comment` in this rule.
\ No newline at end of file
diff --git a/cpp/common/src/codingstandards/cpp/exclusions/c/SideEffects3.qll b/cpp/common/src/codingstandards/cpp/exclusions/c/SideEffects3.qll
index eff4f2caf9..7b01c18099 100644
--- a/cpp/common/src/codingstandards/cpp/exclusions/c/SideEffects3.qll
+++ b/cpp/common/src/codingstandards/cpp/exclusions/c/SideEffects3.qll
@@ -3,7 +3,9 @@ import cpp
 import RuleMetadata
 import codingstandards.cpp.exclusions.RuleMetadata
 
-newtype SideEffects3Query = TUnsequencedSideEffectsQuery()
+newtype SideEffects3Query =
+  TUnsequencedSideEffectsQuery() or
+  TUnsequencedAtomicReadsQuery()
 
 predicate isSideEffects3QueryMetadata(Query query, string queryId, string ruleId, string category) {
   query =
@@ -14,6 +16,15 @@ predicate isSideEffects3QueryMetadata(Query query, string queryId, string ruleId
     "c/misra/unsequenced-side-effects" and
   ruleId = "RULE-13-2" and
   category = "required"
+  or
+  query =
+    // `Query` instance for the `unsequencedAtomicReads` query
+    SideEffects3Package::unsequencedAtomicReadsQuery() and
+  queryId =
+    // `@id` for the `unsequencedAtomicReads` query
+    "c/misra/unsequenced-atomic-reads" and
+  ruleId = "RULE-13-2" and
+  category = "required"
 }
 
 module SideEffects3Package {
@@ -23,4 +34,11 @@ module SideEffects3Package {
       // `Query` type for `unsequencedSideEffects` query
       TQueryC(TSideEffects3PackageQuery(TUnsequencedSideEffectsQuery()))
   }
+
+  Query unsequencedAtomicReadsQuery() {
+    //autogenerate `Query` type
+    result =
+      // `Query` type for `unsequencedAtomicReads` query
+      TQueryC(TSideEffects3PackageQuery(TUnsequencedAtomicReadsQuery()))
+  }
 }
diff --git a/cpp/common/src/codingstandards/cpp/rules/readofuninitializedmemory/ReadOfUninitializedMemory.qll b/cpp/common/src/codingstandards/cpp/rules/readofuninitializedmemory/ReadOfUninitializedMemory.qll
index 9de640db9c..8d701cb26c 100644
--- a/cpp/common/src/codingstandards/cpp/rules/readofuninitializedmemory/ReadOfUninitializedMemory.qll
+++ b/cpp/common/src/codingstandards/cpp/rules/readofuninitializedmemory/ReadOfUninitializedMemory.qll
@@ -131,6 +131,8 @@ class UninitializedVariable extends LocalVariable {
     // Not static or thread local, because they are not initialized with indeterminate values
     not isStatic() and
     not isThreadLocal() and
+    // Not atomic, which have special initialization rules
+    not getType().hasSpecifier("atomic") and
     // Not a class type, because default initialization of a class calls the default constructor
     // The default constructor may leave certain fields uninitialized, but that would be a separate
     // field-wise analysis
diff --git a/cpp/common/test/rules/readofuninitializedmemory/test.cpp b/cpp/common/test/rules/readofuninitializedmemory/test.cpp
index bdd3fdc203..6ed07d795f 100644
--- a/cpp/common/test/rules/readofuninitializedmemory/test.cpp
+++ b/cpp/common/test/rules/readofuninitializedmemory/test.cpp
@@ -121,4 +121,6 @@ void test_non_default_init() {
   use(slp); // COMPLIANT - static variables are zero initialized
   thread_local int *tlp;
   use(tlp); // COMPLIANT - thread local variables are zero initialized
+  _Atomic int ai;
+  use(ai); // COMPLIANT - atomics are special and not covered by this rule
 }
\ No newline at end of file
diff --git a/rule_packages/c/SideEffects3.json b/rule_packages/c/SideEffects3.json
index 2bf91d77b9..1ff29ec166 100644
--- a/rule_packages/c/SideEffects3.json
+++ b/rule_packages/c/SideEffects3.json
@@ -16,6 +16,18 @@
             "correctness",
             "external/misra/c/2012/third-edition-first-revision"
           ]
+        },
+        {
+          "description": "The value of an atomic variable shall not depend on evaluation order and interleaving of threads.",
+          "kind": "problem",
+          "name": "The value of an atomic variable shall not depend on the evaluation order of interleaved threads",
+          "precision": "very-high",
+          "severity": "error",
+          "short_name": "UnsequencedAtomicReads",
+          "tags": [
+            "correctness",
+            "external/misra/c/2012/amendment3"
+          ]
         }
       ],
       "title": "The value of an expression and its persistent side effects shall be the same under all permitted evaluation orders"