á€áááºááŸá¬ RDP áááá¯ááá¯áá±á¬ááŸáá·áºá¡áá¯ááºáá¯ááºáááºá¡ááœáẠopen source áááá¯ááááºáá»á¬ážááᯠá
ááºážáááºááŒááºážá¡ááŒá±á¬ááºáž áá±á¬ááºážáá«ážááœá²áá
áºáá¯ááœáẠáá¯áááááŒááºáááºáá¯á¶ážáááºááŒááºážááŒá
áºáááºá áááºážááœááºáá»áœááºá¯ááºááá¯á·ááẠrdesktop client ááŸáá·áº xrdp server ááá¯ááŒáá·áºááŸá¯áá«áááºá
á¡ááŸá¬ážáá»á¬ážááᯠáá±á¬áºáá¯ááºááẠáááááá¬áá
áºáá¯á¡ááŒá
Ạá¡áá¯á¶ážááŒá¯áááºá
áá±á¬ááºážáá«ážááẠáá»áœááºá¯ááºá¡ááœáẠá áááºáááºá á¬ážááœááºáá±á¬ááºážáá±á¬ á¡ááŸá¬ážáá»á¬ážááá¯áᬠáááºáááºáá«áááºá ááá¯á·áá±á¬áº ááá±á¬áá»ááºáá»á¬ážááẠáá±ážáááºáá±á¬ááŒá±á¬áá·áº á¡ááŸá¬ážá¡ááœááºážá¡áááºážáááºááŸááá²á·áááºá
ááœá±á¬ááá¯. FreeRDP ááá±á¬áá»ááºá¡áááºááŒá¯ááŒááºážááá¯ááºáᬠááááºáá±á¬ááºážáá«ážááᯠááœá±á·ááá¯ááºáááºá
áááºá áºáá±á¬á·
á€áááá¯ááºážááá·áºááẠá¡ááœááºáá±áááºážá á¬ážááẠ- áááºážááᯠReactOS ááœáẠáá°áááºážá¡ááá¯ááºážá¡áá¯á¶ážááŒá¯áá¬ážááŒá®áž áááºážá¡ááœáẠááŒááºáááááºáá áºááá¯ááºáᬠá¡ááŸá±á·áááºá áœááºážáá»á¬ážááá¯áááºáž áááºááŸá¬ááœá±ááá¯ááºáááºá ááá¯á·áá±á¬áºá áá°áááºá¡áá±á¬áºáá±ážá¡áá¯áá±ááŒá®ááŒá áºáááºá áá°áááááá¯á¶ážáá¯ááºáá±ááŸá¯áááºá§ááŒá® áá áááá ááœááºááŒá¯áá¯ááºáá²á·ááẠ- á á¬áá±ážáá»áááºááá°áááºá¡ááẠáá ááŸá áºááŒá áºáááºá
á á±á¬á á±á¬áááŒá±á¬áá²á·áááá¯áá² ááá±á¬áá»ááºá áá±ážáá±ážáá±ážáá«á áááºážááœáẠáá¯ááºááá¯ááºážáá±á«ááºáž 30 ááá·áºáá«áááºááŒá®áž áááºážááœáẠáááºážáá¡áááºá¡ááœááºá¡á á¡áááºážáááºáá°ážáááºážáááºá ááŸáá¯ááºážááŸááºáááºá¡ááœáẠFreeRDP ááœáẠááá¯ááºáž ááá,ááá áá«ááŸááááºá á€áááºááŸá¬ Cloc áááá¯ááááºá ááááºááŒá áºáááºá
áááºááœááºááááá±á¬áá¯ááº
int
main(int argc, char *argv[])
{
....
return handle_disconnect_reason(deactivated, ext_disc_reason);
if (g_redirect_username)
xfree(g_redirect_username);
xfree(g_username);
}
áá¯ááºáá±á¬ááºáá»ááºááœáẠá¡ááŸá¬ážá áá»áœááºá¯ááºááá¯á·ááᯠáá»ááºáá»ááºážááœá±á·áááºá á¡ááá: á¡á±á¬áºááá±áá¬áá²á·áá±á¬ááºááŸá¬ áá¯ááºááá¯ááŒááºááááºá ááŒááºáᬠ- á€á¡ááá¯ááºážá¡á ááẠááŸááºáá¬ááºááá·áºááŸááºážáá±ážááᯠáá¯ááºáá±á¬ááºáááºá ááá¯á·áá¬ááœááºá á¡ááŸá¬ážááẠááŒáááºážááŒá±á¬ááºááŸá¯áá áºáá¯ááá¯ááºáá±- áááá¯ááááºááŸááœááºááŒá®ážáá±á¬áẠááœá²áá±áááºááŸááºáá¬ážáá±á¬ááŸááºáá¬ááºá¡á¬ážáá¯á¶ážááᯠáááºáááºááŸá¯á áá áºá ááŸááºážáááºážááœá¬ážáááºááŒá áºáááºá
ááá¯ááºááœááºáá¬ááœáẠá¡ááŸá¬ážá¡ááœááºážáááŸááá«á
RD_BOOL
subprocess(char *const argv[], str_handle_lines_t linehandler, void *data)
{
int n = 1;
char output[256];
....
while (n > 0)
{
n = read(fd[0], output, 255);
output[n] = ' '; // <=
str_handle_lines(output, &rest, linehandler, data);
}
....
}
á€ááá á¹á ááœáẠáá¯ááºá¡ááá¯á¡ááœá¬ááẠááá¯ááºá០ááá¯ááºááŒá®ážáá¯á¶ážáááºá¡áá ááŒá¬ážáá¶áá áºáá¯ááá¯á· áááºáááºá ááá¯á·áá±á¬áº á€áá±áá¬ááœáẠááá¯ááºááœááºáá¬ááœáẠá¡ááŸá¬ážá¡ááœááºážáááŸááá«- áá áºáá¯áᯠááŸá¬ážáá±áá«áá ááá¯á·áá±á¬áẠááẠ-1 ááŒááºáá¬áááºááŒá áºááŒá®ážá ááá¯á·áá±á¬áẠarray ááẠoverrun ááŒá áºáááá·áºáááºá output ááá¯.
char á¡áá»áá¯ážá¡á á¬ážááœáẠEOF ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážá
int
ctrl_send_command(const char *cmd, const char *arg)
{
char result[CTRL_RESULT_SIZE], c, *escaped;
....
while ((c = fgetc(fp)) != EOF && index < CTRL_RESULT_SIZE && c != 'n')
{
result[index] = c;
index++;
}
....
}
á€áá±áá¬ááœáẠááá¯ááºáá¡áá¯á¶ážááá¯á·áá±á¬ááºááŸáááŒááºážá ááŸá¬ážááœááºážá áœá¬ááá¯ááºááœááºááŸá¯ááᯠáá»áœááºá¯ááºááá¯á·ááœá±á·ááŒááºááááº- if fgetc áá¯ááºááẠ0xFF áá°áá±á¬ á á¬áá¯á¶ážááᯠááŒááºáá±ážáááºá áááºážááᯠááá¯ááºáá¡áá¯á¶ážá¡ááŒá Ạá¡áááá¹áá¬ááºááœáá·áºááẠ(EOF).
EOF áá¯á¶ááŸááºá¡á¬ážááŒáá·áº -1 áᯠáááºááŸááºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá CP1251 áá¯ááºáá¶áá«ááºááœááºá áá¯ááŸá¬ážá¡áá¹ááá¬ááá±á¬ááºáá¯á¶ážá á¬áá¯á¶ážááœáẠáá¯ááºáá¶áá«áẠ0xFF áá«ááŸáááŒá®ážá á¡áááºá áá»áœááºá¯ááºááá¯á·ááẠááááºážááŸááºáá áºáá¯á¡ááŒá±á¬ááºážááŒá±á¬áá«á áá¶áá«ááº-1 ááŸáá·áº ááá¯ááºáá®áá±á¬á char. áááºá¹áá±á 0xFF áá²á·ááá¯á·ááŒá áºááá¯ááºáááºá EOF (-á) ááá¯ááºáá¡áá¯á¶ážáᯠá¡áááá¹áá¬ááºááááºá ááá¯ááá¯á·áá±á¬á¡ááŸá¬ážáá»á¬ážááá¯ááŸá±á¬ááºááŸá¬ážáááº, function áááááºááŒá áºáá«áááºá fgetc ááŒáá¯ááºáá²á· variable áá²ááŸá¬ ááááºážáá¬ážááá·áºáá«áááºá int.
á á¬áá¯á¶ážáá±á«ááºáž
áá áºááá¯ááºážáá áºá á
RD_NTSTATUS
disk_set_information(....)
{
time_t write_time, change_time, access_time, mod_time;
....
if (write_time || change_time)
mod_time = MIN(write_time, change_time);
else
mod_time = write_time ? write_time : change_time; // <=
....
}
á€áá¯ááºáá±ážáá°ááẠááŸá¬ážááœá¬ážááá¯ááºáááºá || О && á¡ááŒá±á¡áá±ááœááºá áááºááá¯ážáá»á¬ážá¡ááœáẠááŒá áºááá¯ááºáá»á±ááŸááá±á¬ ááœá±ážáá»ááºááŸá¯áá»á¬ážááᯠáá¯á¶ážáááºááŒáá·áºááŒáá«á áá¯á· áá±ážáááºá¡áá»ááẠО á¡ááŒá±á¬ááºážá¡áá²_á¡áá»áááº:
- ááááºážááŸááºááŸá áºáá¯áá¯á¶ážááẠ0 ááŸáá·áº áá®áá»áŸáááº- á€ááá á¹á ááœáẠáá»áœááºá¯ááºááá¯á·ááẠá¡ááá¯ááºážá¡áááºáá áºáá¯ááœáẠá¡áá¯á¶ážáááºáá«áááºá á¡ááŒá¬ážáá°: ááŒá±á¬ááºážáá²ááá¯ááºáááºá mod_time áá±á¬ááºáááºááœá² á¡ááŒá±á¡áá± áááºááá¯áá² ááŒá áºááŒá Ạá¡ááŒá²áááºáž 0 ááŒá áºáááá·áºáááºá
- ááááºážááŸááºáá»á¬ážáá²á០áá áºáá¯ááŸá¬ 0 ááŒá áºáááºá mod_time 0 ááŸáá·áº áá®áááá·áºááẠ(á¡ááŒá¬áž variable ááœáẠá¡áá¯ááºááá¹ááá¬ááá¯ááºáá±á¬áááºááá¯áž) ááŸááá±á¬ááŒá±á¬áá·áºááŒá áºáááºá MIN ááœá±ážá áá¬ááŸá áºáá¯áá²á á¡áá±ážááᯠááœá±ážáááá·áºáááºá
- ááááºážááŸááºááŸá áºáá¯áá¯á¶ážááẠ0 ááŸáá·áº ááá®áá«- á¡áááá·áºáá¯á¶ážáááºááá¯ážááᯠááœá±ážáá«á
á¡ááŒá±á¡áá±áá²á· á¡á á¬ážááá¯ážáá²á·á¡áá« write_time && change_time á¡ááŒá¯á¡áá°ááẠááŸááºáááá·áºáááº-
- ááááºážááŸááºáá áºáᯠááá¯á·ááá¯áẠááŸá áºáá¯á áá¯á¶ážááẠ0 ááŸáá·áº ááá®áá«- áá¯áááá¯ááºáá±á¬ áááºááá¯ážááᯠááœá±ážáá«á
- ááááºážááŸááºááŸá áºáá¯áá¯á¶ážááẠ0 ááŸáá·áº ááá®áá«- á¡áááá·áºáá¯á¶ážáááºááá¯ážááᯠááœá±ážáá«á
áá áºááá¯ááºážáá áºá á
static RD_NTSTATUS
disk_device_control(RD_NTHANDLE handle, uint32 request, STREAM in,
STREAM out)
{
....
if (((request >> 16) != 20) || ((request >> 16) != 9))
return RD_STATUS_INVALID_PARAMETER;
....
}
á¡á±á¬áºááá±áá¬áá»á¬ážááẠá€áá±áá¬ááœááºáááºáž áá±á¬ááœá±ážáá±áá¯á¶ááááºá || О &&ááá¯á·ááá¯áẠ== О !=: ááááºážááŸááºáá áºáá¯ááẠáááºááá¯áž 20 ááŸáá·áº 9 ááᯠáá áºáá»áááºáááºážááœáẠááááá¯ááºáá«á
á¡ááá·áºá¡áááºáááŸá ááá¯ááºážáá°ážáá°ááŒááºážá
RD_NTSTATUS
disk_query_directory(....)
{
....
char *dirname, fullpath[PATH_MAX];
....
/* Get information for directory entry */
sprintf(fullpath, "%s/%s", dirname, pdirent->d_name);
....
}
áá¯ááºáá±á¬ááºáá»ááºááᯠá¡ááŒáá·áºá¡á á¯á¶ááŒáá·áºáá±á¬á¡áá«á á€áá¯ááºááẠááŒá¿áá¬áááŒá áºá á±ááŒá±á¬ááºáž ááŸááºážááŸááºážáááºážáááºáž áááá¬áá«áááá·áºáááºá ááá¯á·áá¬ááœááºá áááºážááá¯á·ááẠá¡áá¬áááºááœáẠááŒá áºáá±á«áºáá¬ááá¯ááºáááº- ááááááºááœáẠááŒá±á¬ááºážáá²ááŸá¯áá áºáá¯ááŸáá·áº áá»áœááºá¯ááºááá¯á·ááẠááŒá¬ážáá¶ááœáŸááºážááá¯ážááŸá¯ááᯠáááŸááááá·áºáááº- ááŒá±ážááŒááºážá áááºááá·áºá¡áá¬ááá»áŸ ááá·áºáááºááá¬ážáá±á¬ááŒá±á¬áá·áº áááºážááŒá±á¬ááºážáá»á¬ážááᯠáá±á«ááºážá ááºážááá¯ááºáá±á¬á¡áá« array á áááºááááááºáá»á¬ážááᯠáá»á±á¬áºááœááºááœá¬ážááá¯ááºáááºá á€áá±á«áºááá¯ááŸá¯ááᯠáááááŒá¯ááááẠá¡ááŒá¶ááŒá¯á¡ááºáá«áááºá snprintf(fullpathá PATH_MAXáâŠ.).
áááá¯áá±á¬á·áá²á· á¡ááŒá±á¡áá±
static void
inRepos(STREAM in, unsigned int read)
{
SERVER_DWORD add = 4 - read % 4;
if (add < 4 && add > 0)
{
....
}
}
ááŒáá·áºááŸá¯á á áºáá±ážááŒááºáž ááá·áº > 0 á€áá±áá¬ááœáẠáááá¯á¡ááºáá«- ááááºážááŸááºááẠáá¯áááẠá¡ááŒá²ááŒá®ážáá±áááºááŒá áºáá±á¬ááŒá±á¬áá·áºá % 4 ááá¯áááºáá«á á¡ááá¯ááºážáá¡ááŒáœááºážááᯠááŒááºáá±ážáááºá ááá¯á·áá±á¬áº áááºážááŸáá·áº áá®áá»áŸáááºááá¯ááºáá«á
xrdp
- xrdp - áááá¯ááá¯áá±á¬ á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á Apache 2.0 ááá¯ááºá ááºá¡á±á¬ááºááœáẠááŒáá·áºáá±áá¬ážáááºá
- xorgxrdp - xrdp ááŒáá·áºá¡áá¯á¶ážááŒá¯áááºá¡ááœáẠXorg áááá¯ááºáá¬á¡á á¯á¶á ááá¯ááºá áẠ- X11 (MIT áá²á·ááá¯á·á ááá¯á·áá±á¬áº ááŒá±á¬áºááŒá¬ááœáẠá¡áá¯á¶ážááŒá¯ááŒááºážááᯠáá¬ážááŒá áºáá¬ážáááº)
ááá±á¬áá»ááºáááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááẠrdesktop ááŸáá·áº FreeRDP áááááºáá»á¬ážá¡áá±á«áºá¡ááŒá±áá¶áááºá á¡á ááá¯ááºážááœááºá ááááºáá áºááŸáá·áºá¡áá¯ááºáá¯ááºááẠáááºááẠáá®ážááŒá¬áž VNC áá¬áá¬áá áºáᯠááá¯á·ááá¯áẠRDP áá¶á·ááá¯ážááŸá¯- X11rdp áá«áá±á¬ á¡áá°áž X11 áá¬áá¬ááᯠá¡áá¯á¶ážááŒá¯áá²á·ááá±á¬áºáááºáž xorgxrdp ááœááºážáá¬ážáá¬áááºááŸáá·áºá¡áá»áŸ áááºážááá¯á·á¡ááœáẠááá¯á¡ááºáá»ááºáá»á¬áž áá»á±á¬ááºááœááºááœá¬ážáá²á·áááºá
á€áá±á¬ááºážáá«ážááá»áœááºá¯ááºááá¯á·ááẠxorgxrdp á¡ááŒá±á¬ááºážááá±á¬áºááŒáá«á
xrdp ááá±á¬áá»ááºááẠááááºáá²á·ááá¯á·ááẠá¡ááœááºáá±ážáááºááŒá®áž ááá¯ááºážáá±á«ááºáž 80 ááá·áº áá«áááºáá«áááºá
á¡ááŸá¬ážááá¯áá»á¬ážáááºá
static int
rfx_encode_format_rgb(const char *rgb_data, int width, int height,
int stride_bytes, int pixel_format,
uint8 *r_buf, uint8 *g_buf, uint8 *b_buf)
{
....
switch (pixel_format)
{
case RFX_FORMAT_BGRA:
....
while (x < 64)
{
*lr_buf++ = r;
*lg_buf++ = g;
*lb_buf++ = r; // <=
x++;
}
....
}
....
}
á€áá¯ááºá¡á¬áž RemoteFX á¡ááœáẠjpeg2000 codec ááᯠá¡áá¯á¶ážááŒá¯ááá·áº librfxcodec á á¬ááŒáá·áºááá¯ááºá០áá¯ááºáá°áá¬ážáá«áááºá á€ááœááºá áááºááŸá¬ážáááºááŸá¬á ááááºáá áºáá±áá¬áá»ááºáááºáá»á¬áž áá±á¬ááœá±ážáá±ááẠ- "á¡ááŒá¬" á¡áá±á¬ááºá¡á á¬áž "á¡áá®áá±á¬ááº" ááᯠááŸááºáááºážáááºáá¬ážáááºá áá±á¬áºáá®áá°ážááá·áºááŒááºážá ááááºá¡áá±ááŒáá·áº á€á¡ááŸá¬ážááẠááŒá áºááá¯ááºáá»á±áá»á¬ážáá«áááºá
á¡áá¬ážáá°áá¯ááºáá±á¬ááºááŸá¯áá áºáá¯ááœáẠá¡áá¬ážáá°ááŒá¿áá¬ááŒá áºááœá¬ážáá²á·áááºá rfx_encode_format_argbááœá²ááŒááºážá áááºááŒá¬áá°ááŸáááºáž áá»áœááºá¯ááºááá¯á·á¡á¬áž ááŒá±á¬ááŒáááº-
while (x < 64)
{
*la_buf++ = a;
*lr_buf++ = r;
*lg_buf++ = g;
*lb_buf++ = r;
x++;
}
Array ááŒá±ááŒá¬áá»ááº
// evdev-map.c
int xfree86_to_evdev[137-8+1] = {
....
};
// genkeymap.c
extern int xfree86_to_evdev[137-8];
int main(int argc, char **argv)
{
....
for (i = 8; i <= 137; i++) /* Keycodes */
{
if (is_evdev)
e.keycode = xfree86_to_evdev[i-8];
....
}
....
}
á€ááá¯ááºááŸá áºáá¯ááŸá array á ááŒá±ááŒá¬áá»ááºááŸáá·áº á¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºááẠááá¯ááºáá®ááŸá¯áááŸááá« - á¡ááœááºá¡á á¬ážááẠ1 ááŒáá·áº ááœá²ááŒá¬ážáá«áááºá ááá¯á·áá±á¬áºá á¡ááŸá¬ážá¡ááœááºážáááŸááá« - ááŸááºáááºáá±á¬á¡ááœááºá¡á á¬ážááᯠevdev-map.c ááá¯ááºááœáẠáááºááŸááºáá¬ážáá±á¬ááŒá±á¬áá·áº á¡ááá·áºá¡áááºáááŸááá±á áá®áá±á¬á· áá«á á¡ááœááºááá° ááŒááºááá¯á·ááá²á· bug áá áºáá¯áá«áá²á
ááŸá¬ážááœááºážáá±á¬ ááŸáá¯ááºážááŸááºááŸá¯
// common/parse.h
#if defined(B_ENDIAN) || defined(NEED_ALIGN)
#define in_uint16_le(s, v) do
....
#else
#define in_uint16_le(s, v) do
{
(v) = *((unsigned short*)((s)->p));
(s)->p += 2;
} while (0)
#endif
int
xrdp_caps_process_confirm_active(struct xrdp_rdp *self, struct stream *s)
{
int cap_len;
....
in_uint16_le(s, cap_len);
....
if ((cap_len < 0) || (cap_len > 1024 * 1024))
{
....
}
....
}
function ááẠtype variable ááá¯áááºáááºá áááºááŸááºáááá¯ážááᯠvariable áá²ááá¯áááºáá«á int. áá»áœááºá¯ááºááá¯á·ááẠáááºááŸááºáááá¯ážáá¬ážáá±á¬ ááááºážááŸááºááᯠáááºááŸá¯ááŒá®áž ááááºááᯠááá¯ááŒá®ážáá±á¬ ááááºážááŸááºááá¯á· áááºááŸááºáá±ážáá±á¬ááŒá±á¬áá·áº á€áá±áá¬ááœáẠá á áºáá±ážááẠáááá¯á¡ááºáá«á ááá¯á·ááŒá±á¬áá·áº ááááºážááŸááºááẠá¡áá¯ááºáááºááá¯ážááᯠáá°ááááá«á
áááá¯á¡ááºáá±á¬á á áºáá±ážááŸá¯áá»á¬áž
int EXPORT_CC
libxrdp_send_pointer(struct xrdp_session *session, int cache_idx,
char *data, char *mask, int x, int y, int bpp)
{
....
if ((bpp == 15) && (bpp != 16) && (bpp != 24) && (bpp != 32))
{
g_writeln("libxrdp_send_pointer: error");
return 1;
}
....
}
áá»áœááºá¯ááºááá¯á·ááẠá¡á ááá¯ááºážááœáẠááŸáá¯ááºážááŸááºáá»ááºááŸáááŒá®ážáá¬ážááŒá áºáá±á¬ááŒá±á¬áá·áº ááá®áá»áŸááŸá¯á á áºáá±ážááŸá¯áá»á¬ážááẠá€áá±áá¬ááœáẠá¡áááá¹áá¬ááºáááŸááá±á áá«áᬠtypo áá áºáá¯ááŒá áºááŒá®áž developer á á¡á±á¬áºááá±áá¬ááᯠá¡áá¯á¶ážááŒá¯áá»ááºáá²á·áᬠááŒá áºááá¯ááºáááºá || áááŸááºáááºáá±á¬ á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážááᯠá á áºáá¯ááºáááºá
áá±á¬ááºáá»ááº
á
á
áºáá±ážáá±á
ááºá¡ááœááºáž ááŒá®ážáá±ážáá±á¬á¡ááŸá¬ážá¡ááœááºážáá»á¬ážááᯠááá±á¬áºáá¯ááºáá²á·áá² áá»áá¯á·ááœááºážáá»ááºáá»á¬ážá
áœá¬ááᯠááœá±á·ááŸááá²á·áááºá ááá¯á·áá±á¬áºáááºáž á€áá®ááá¯ááºážáá»á¬ážááᯠáááºáááºáá»á¬ážá
áœá¬ááœáẠáá±ážáááºáá±á¬áºáááºáž á
áá
áºáá»á¬ážá
áœá¬ááœáẠá¡áá¯á¶ážááŒá¯áá«áááºá ááá±á¬áá»ááºáááºáá
áºáá¯ááœáẠá¡ááŸá¬ážá¡ááœááºážáá»á¬ážá
áœá¬ááŸááááºáááá¯á¡ááºáá«á ááá¯á·ááŒá±á¬áá·áº ááœá²ááŒááºážá
áááºááŒá¬áá°áá
áœááºážáá±á¬ááºáááºááᯠááá±á¬áá»ááºáááºáá»á¬ážááœááºáᬠá¡áá²ááŒááºááŒááºážáááŒá¯ááá·áºáá«á áá®á¡ááŒá±á¬ááºážááᯠáá±á¬ááºážáá«ážááŸá¬ áááºáááºáááºááŸá¯ááá¯ááºáá«áááº"
PVS-Studio á á¡á
ááºážáá¬ážááŸááºážááᯠáá»áœááºá¯ááºááá¯á·áá¶á០áá±á«ááºážáá¯ááºáá¯ááºááá¯ááºáá«áááºá
á€áá±á¬ááºážáá«ážááᯠá¡ááºá¹áááááºá
áá¬ážááŒá±á¬ááááááºááŸáá·áº áá»áŸáá±ááá¯áá«áá áá¬áá¬ááŒááºááá·áºááº- Sergey Larin ááᯠá¡áá¯á¶ážááŒá¯áá«á
source: www.habr.com