Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 230

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

Β val = { fltnum = 6.6614606209589101e-316, sp = 0x0,

Β slen = 0, sref = 1, idx = 0),

Β hash = {next = 0x8095598, name = 0x0, length = 0,

Β value = 0x0, ref = 1}}, type = Node_K_print, flags = 1}

Π­Ρ‚ΠΎ ΠΊΡƒΡ‡Π° вязкой массы. Однако, GDB всС ΠΆΠ΅ нСсколько ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Π΅Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ выраТСния Π²Ρ€ΠΎΠ΄Π΅ '

($1).sub.val.slen
', Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Ρ‡Π΅Ρ€Π΅Π· Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ структуры Π΄Π°Π½Π½Ρ‹Ρ….

Π•ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ для избСгания объСдинСний. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, объСдинСния Π½Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ. Ничто, ΠΊΡ€ΠΎΠΌΠ΅ внимания программиста, Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ доступ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ части объСдинСния, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ доступ ΠΊ Ρ‚ΠΎΠΉ части, которая Π±Ρ‹Π»Π° сохранСна послСднСй. ΠœΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ это Π²

ch15-union.c
, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ доступ ΠΊ ΠΎΠ±ΠΎΠΈΠΌ «элСмСнтам» объСдинСния осущСствлялся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

Вторая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, связанная с ΠΏΠ΅Ρ€Π²ΠΎΠΉ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² остороТности с пСрСкрытиями Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ

struct
/
union
. НапримСр, Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсии
gawk
[173] Π±Ρ‹Π» Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄.

/* n->lnode ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива, Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ unref, Ссли это массив */

if (n->type != Node_var_array && n->type != Node_array_ref)

unref(n->lnode);

ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ

if
Π½Π΅ Π±Ρ‹Π»ΠΎ, Π±Ρ‹Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π·ΠΎΠ²
unref()
, которая освобоТдаСт
NODE
, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚
n->lnode
. Однако, Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚
gawk
ΠΌΠΎΠ³Π»Π° ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ сСбС ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎ отслСТиваниС Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅ Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»ΠΎΡΡŒ ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π½Π° самом Π΄Π΅Π»Π΅ Π±Ρ‹Π»ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ массива!

Π’ качСствС отступлСния, объСдинСния Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² Π‘++. НаслСдованиС ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ возмоТности ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΏΡ€ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ структурами Π΄Π°Π½Π½Ρ‹Ρ… совсСм Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, которая Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ бСзопаснСС.

РСкомСндация: ΠΏΠΎ возмоТности ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ объСдинСний (

union
). Если это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈΡ…!

15.4.2. ΠžΡ‚Π»Π°ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния

Помимо Ρ‚Π΅Ρ… Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ добавляСтС ΠΊ своСму ΠΊΠΎΠ΄Ρƒ для Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для обСспСчСния возмоТностСй ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния. Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΏΠΎΠ»Π΅Π²Ρ‹Ρ… условиях, ΠΊΠΎΠ³Π΄Π° Π² систСмС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ установлСнного исходного ΠΊΠΎΠ΄Π° (Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Π΄Π°ΠΆΠ΅ ΠΈ компилятора!)

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ прСдставлСны Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ использовали Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ряда Π»Π΅Ρ‚, ΠΎΡ‚ простых Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ слоТных. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ нашС рассмотрСниС Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС Π½Π΅ являСтся ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΠΈΠΌ. Π­Ρ‚ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стоит ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ!

15.4.2.1. ДобавляйтС ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΎΠΉ являСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΡ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ. Вакая опция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ условно ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Однако Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ являСтся ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ Π² Π³ΠΎΡ‚ΠΎΠ²ΠΎΠΉ вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. (Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ эту ΠΎΠΏΡ†ΠΈΡŽ Π½Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ. Π—Π΄Π΅ΡΡŒ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ компромиссы: Π΅Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ вашим покупатСлям ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ большС ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ внутрСнности вашСй систСмы, Ρ‡Π΅Π³ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π΅ Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π½Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΅Π΅ каТСтся довольно ΠΏΠΎΠ΄Π»Ρ‹ΠΌ. Если Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ для Open Source ΠΈΠ»ΠΈ Free Software, Π»ΡƒΡ‡ΡˆΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ.)

Если ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° большая, отладочная опция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, ΠΊΠ°ΠΊΡƒΡŽ подсистСму слСдуСт ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ. На основС этого Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π»Π°Π³ΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π»Π°Π³ΠΎΠ²Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’ΠΎΡ‚ схСма этой ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ:

struct option options[] = {

Β ...

Β { "debug", required_argument, NULL, 'D' },

Β ...

};

int main(int argc, char **argv) {

Β int c;

Β while ((c = getopt_long(argc, argv, "...D:")) != -1) {

Β  switch (c) {

Β Β  ...

Β  case 'D':

Β Β  parse_debug(optarg);

Β Β  break;

Β Β  ...

Β  }

Β }

Β ...

}

Ѐункция

parse_debug()
считываСт строку Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². НапримСр, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ строка Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… запятыми ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ подсистСм, Π²Ρ€ΠΎΠ΄Π΅ "
file,memory,ipc
". Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ подсистСмы функция устанавливаСт Π±ΠΈΡ‚ Π² ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

extern int debugging;

void parse_debug(const char *subsystems) {

Β char *sp;

Β for (sp = subsystems; *sp != '\0';) {

Β  if (strncmp(sp, "file", 4) == 0) {

Β Β  debugging |= DEBUG_FILE;

Β Β  sp += 4;

Β  } else if (strncmp(sp, "memory", 6) == 0) {

Β Β  debugging |= DEBUG_MEM;

Β Β  sp += 6;

Β  } else if (strncmp(sp, "ipc", 3) == 0) {

Β Β  debugging |= DEBUG_IPC;

Β Β  sp += 3;

Β Β  ...

Β  }

Β  while (*sp == ' ' || *sp == ',') sp++;

Β }

}

Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС ΠΊΠΎΠ΄ прилоТСния ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ΠΈ:

if ((debugging & DEBUG_FILE) != 0) ...

Β /* Π’ части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° */

if ((debugging & DEBUG_MEM) != 0) ... /* Π’ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π΅ памяти */

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈ ΠΎΠ΄Π½Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с Ρ„Π»Π°Π³ΠΎΠ²Ρ‹ΠΌΠΈ Π±ΠΈΡ‚Π°ΠΌΠΈ, Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ массив, индСксируСмый ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ константами (ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·

enum
), зависит ΠΎΡ‚ вас.