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
LREALdeğ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'
Ayrıca bakınız