SA0103: Atomik olmayan verilere eşzamanlı erişimPermalink

Atomik olmayan değişkenlerin (örneğin veri türü ‎STRING‎, ‎WSTRING‎, ‎ARRAY‎, ‎STRUCT‎, FB örnekleri, 64 bit veri türleri) birden fazla task’te kullanılıp kullanılmadığını tespit eder

Gerekçe: Erişim sırasında senkronizasyon olmadığında, aynı anda bir task’te okuma ve başka bir task’te yazma yapılırken tutarsız değerler okunabilir.

Önemliymiş: Orta

Bazı veri türleri için, özellikle 64 bit tamsayılar için, erişimin atomik olup olmadığı platforma bağlıdır. Statik analiz, yalnızca denetleyici 64 bit tamsayı veri türlerine atomik erişimi desteklemediğinde bir sorun olduğunu bildirir.

Bu kural aşağıdaki durumlarda geçerli değildir:

  • Hedef sistemde bir kayan nokta birimi (FPU) varsa, birden fazla task’in ‎LREAL‎ değişkenlerine erişimi algılanmaz

  • Hedef sistem 64 bit işlemciyse veya hedef cihaz için ilgili hedef ayarı yapılmışsa, kural 64 bit veri türleri için geçerli değildir

Örnek

Proje, ‎PRG1‎ ve ‎PRG2‎ olmak üzere iki program içermektedir: ‎PRG1‎ programı ‎MainTask_1‎ task’i tarafından çağrılır. ‎PRG2‎ programı ‎MainTask_2‎ task’i tarafından çağrılır.

GVL
VAR_GLOBAL	
	lrTest : LREAL;   // Since the target system has an FPU, SA0103 does apply.
	lint1 : LINT;
	sTest : STRING;   // SA0103
	wsTest : WSTRING; // SA0103
END_VAR

PROGRAM PRG1
GVL.lrTest := 5.0;
GVL.sTest := 'welt';
GVL.wsTest := "welt";
GVL.lint1 := 99;

PROGRAM PRG2
GVL.lrTest := 5.0;
GVL.sTest := 'hallo';
GVL.wsTest := "hallo";
GVL.lint1 := 88;

--> SA0103: Concurrent access on not atomic data 'sTest'
--> SA0103: Concurrent access on not atomic data 'wsTest'