RDP ਪ੍ਰੋਟੋਕੋਲ ਨਾਲ ਕੰਮ ਕਰਨ ਲਈ ਓਪਨ ਸੋਰਸ ਪ੍ਰੋਗਰਾਮਾਂ ਦੀ ਜਾਂਚ ਕਰਨ ਬਾਰੇ ਲੇਖਾਂ ਦੀ ਲੜੀ ਵਿੱਚ ਇਹ ਦੂਜੀ ਸਮੀਖਿਆ ਹੈ। ਇਸ ਵਿੱਚ ਅਸੀਂ rdesktop ਕਲਾਇੰਟ ਅਤੇ xrdp ਸਰਵਰ ਨੂੰ ਵੇਖਾਂਗੇ।
ਗਲਤੀਆਂ ਦੀ ਪਛਾਣ ਕਰਨ ਲਈ ਇੱਕ ਸਾਧਨ ਵਜੋਂ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ
ਲੇਖ ਸਿਰਫ ਉਹ ਗਲਤੀਆਂ ਪੇਸ਼ ਕਰਦਾ ਹੈ ਜੋ ਮੈਨੂੰ ਦਿਲਚਸਪ ਲੱਗਦੀਆਂ ਸਨ. ਹਾਲਾਂਕਿ, ਪ੍ਰੋਜੈਕਟ ਛੋਟੇ ਹਨ, ਇਸ ਲਈ ਕੁਝ ਗਲਤੀਆਂ ਸਨ :).
ਟਿੱਪਣੀ. FreeRDP ਪ੍ਰੋਜੈਕਟ ਤਸਦੀਕ ਬਾਰੇ ਇੱਕ ਪਿਛਲਾ ਲੇਖ ਪਾਇਆ ਜਾ ਸਕਦਾ ਹੈ
rdesktop
ਇਹ ਕਲਾਇੰਟ ਬਹੁਤ ਮਸ਼ਹੂਰ ਹੈ - ਇਹ ReactOS ਵਿੱਚ ਮੂਲ ਰੂਪ ਵਿੱਚ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ, ਅਤੇ ਤੁਸੀਂ ਇਸਦੇ ਲਈ ਥਰਡ-ਪਾਰਟੀ ਗ੍ਰਾਫਿਕਲ ਫਰੰਟ-ਐਂਡ ਵੀ ਲੱਭ ਸਕਦੇ ਹੋ। ਹਾਲਾਂਕਿ, ਉਹ ਕਾਫ਼ੀ ਪੁਰਾਣਾ ਹੈ: ਉਸਦੀ ਪਹਿਲੀ ਰਿਲੀਜ਼ 4 ਅਪ੍ਰੈਲ, 2001 ਨੂੰ ਹੋਈ ਸੀ - ਲਿਖਣ ਦੇ ਸਮੇਂ, ਉਹ 17 ਸਾਲ ਦਾ ਹੈ।
ਜਿਵੇਂ ਕਿ ਮੈਂ ਪਹਿਲਾਂ ਨੋਟ ਕੀਤਾ ਹੈ, ਪ੍ਰੋਜੈਕਟ ਬਹੁਤ ਛੋਟਾ ਹੈ. ਇਸ ਵਿੱਚ ਕੋਡ ਦੀਆਂ ਲਗਭਗ 30 ਹਜ਼ਾਰ ਲਾਈਨਾਂ ਹਨ, ਜੋ ਕਿ ਇਸਦੀ ਉਮਰ ਨੂੰ ਦੇਖਦੇ ਹੋਏ ਥੋੜ੍ਹਾ ਅਜੀਬ ਹੈ। ਤੁਲਨਾ ਲਈ, FreeRDP ਵਿੱਚ 320 ਹਜ਼ਾਰ ਲਾਈਨਾਂ ਹਨ। ਇੱਥੇ ਕਲੌਕ ਪ੍ਰੋਗਰਾਮ ਦਾ ਆਉਟਪੁੱਟ ਹੈ:
ਪਹੁੰਚਯੋਗ ਕੋਡ
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 ਵਾਪਸ ਆ ਜਾਵੇਗਾ, ਅਤੇ ਫਿਰ ਐਰੇ ਓਵਰਰਨ ਹੋ ਜਾਵੇਗਾ ਆਉਟਪੁੱਟ.
ਚਾਰ ਕਿਸਮ ਵਿੱਚ 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 (-1) ਨੂੰ ਫਾਈਲ ਦੇ ਅੰਤ ਵਜੋਂ ਸਮਝਿਆ ਜਾਂਦਾ ਹੈ। ਅਜਿਹੀਆਂ ਗਲਤੀਆਂ ਤੋਂ ਬਚਣ ਲਈ, ਫੰਕਸ਼ਨ ਦਾ ਨਤੀਜਾ ਹੈ fgetc ਵਰਗੇ ਵੇਰੀਏਬਲ ਵਿੱਚ ਸਟੋਰ ਕੀਤਾ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ ਇੰਟ.
ਟਾਈਪੋਜ਼
ਖੰਡ 1
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 ਦੇ ਬਰਾਬਰ ਹੋਵੇਗਾ (ਬਸ਼ਰਤੇ ਕਿ ਦੂਜੇ ਵੇਰੀਏਬਲ ਦਾ ਇੱਕ ਗੈਰ-ਨੈਗੇਟਿਵ ਮੁੱਲ ਹੋਵੇ), ਕਿਉਂਕਿ MIN ਦੋ ਵਿਕਲਪਾਂ ਵਿੱਚੋਂ ਛੋਟੇ ਨੂੰ ਚੁਣੇਗਾ।
- ਦੋਵੇਂ ਵੇਰੀਏਬਲ 0 ਦੇ ਬਰਾਬਰ ਨਹੀਂ ਹਨ: ਨਿਊਨਤਮ ਮੁੱਲ ਚੁਣੋ।
ਨਾਲ ਸ਼ਰਤ ਨੂੰ ਬਦਲਣ ਵੇਲੇ write_time && change_time ਵਿਹਾਰ ਸਹੀ ਦਿਖਾਈ ਦੇਵੇਗਾ:
- ਇੱਕ ਜਾਂ ਦੋਵੇਂ ਵੇਰੀਏਬਲ 0 ਦੇ ਬਰਾਬਰ ਨਹੀਂ ਹਨ: ਇੱਕ ਗੈਰ-ਜ਼ੀਰੋ ਮੁੱਲ ਚੁਣੋ।
- ਦੋਵੇਂ ਵੇਰੀਏਬਲ 0 ਦੇ ਬਰਾਬਰ ਨਹੀਂ ਹਨ: ਨਿਊਨਤਮ ਮੁੱਲ ਚੁਣੋ।
ਖੰਡ 2
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);
....
}
ਜਦੋਂ ਤੁਸੀਂ ਫੰਕਸ਼ਨ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਦੇਖਦੇ ਹੋ, ਤਾਂ ਇਹ ਸਪੱਸ਼ਟ ਹੋ ਜਾਵੇਗਾ ਕਿ ਇਹ ਕੋਡ ਸਮੱਸਿਆ ਪੈਦਾ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਹਾਲਾਂਕਿ, ਉਹ ਭਵਿੱਖ ਵਿੱਚ ਪੈਦਾ ਹੋ ਸਕਦੇ ਹਨ: ਇੱਕ ਲਾਪਰਵਾਹੀ ਤਬਦੀਲੀ ਅਤੇ ਅਸੀਂ ਇੱਕ ਬਫਰ ਓਵਰਫਲੋ ਪ੍ਰਾਪਤ ਕਰਾਂਗੇ - ਸਪ੍ਰਿੰਟ ਕਿਸੇ ਵੀ ਚੀਜ਼ ਦੁਆਰਾ ਸੀਮਿਤ ਨਹੀਂ ਹੈ, ਇਸਲਈ ਜਦੋਂ ਮਾਰਗਾਂ ਨੂੰ ਜੋੜਦੇ ਹਾਂ ਤਾਂ ਅਸੀਂ ਐਰੇ ਦੀਆਂ ਸੀਮਾਵਾਂ ਤੋਂ ਬਾਹਰ ਜਾ ਸਕਦੇ ਹਾਂ। ਇਸ ਕਾਲ 'ਤੇ ਨੋਟਿਸ ਕਰਨ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ 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 ਭਾਗ ਦਾ ਬਾਕੀ ਹਿੱਸਾ ਵਾਪਸ ਕਰੇਗਾ, ਪਰ ਇਹ ਕਦੇ ਵੀ 4 ਦੇ ਬਰਾਬਰ ਨਹੀਂ ਹੋਵੇਗਾ।
xrdp
- xrdp - ਪ੍ਰੋਟੋਕੋਲ ਲਾਗੂ ਕਰਨਾ। ਅਪਾਚੇ 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++;
}
....
}
....
}
ਇਹ ਕੋਡ librfxcodec ਲਾਇਬ੍ਰੇਰੀ ਤੋਂ ਲਿਆ ਗਿਆ ਸੀ, ਜੋ RemoteFX ਲਈ jpeg2000 ਕੋਡੇਕ ਨੂੰ ਲਾਗੂ ਕਰਦਾ ਹੈ। ਇੱਥੇ, ਜ਼ਾਹਰ ਤੌਰ 'ਤੇ, ਗ੍ਰਾਫਿਕ ਡੇਟਾ ਚੈਨਲਾਂ ਨੂੰ ਮਿਲਾਇਆ ਜਾਂਦਾ ਹੈ - "ਨੀਲੇ" ਰੰਗ ਦੀ ਬਜਾਏ, "ਲਾਲ" ਦਰਜ ਕੀਤਾ ਗਿਆ ਹੈ। ਇਹ ਗਲਤੀ ਸੰਭਾਵਤ ਤੌਰ 'ਤੇ ਕਾਪੀ-ਪੇਸਟ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਪ੍ਰਗਟ ਹੋਈ ਹੈ।
ਇੱਕ ਸਮਾਨ ਫੰਕਸ਼ਨ ਵਿੱਚ ਵੀ ਇਹੀ ਸਮੱਸਿਆ ਆਈ ਹੈ rfx_encode_format_argb, ਜਿਸਨੂੰ ਵਿਸ਼ਲੇਸ਼ਕ ਨੇ ਸਾਨੂੰ ਇਹ ਵੀ ਦੱਸਿਆ ਹੈ:
while (x < 64)
{
*la_buf++ = a;
*lr_buf++ = r;
*lg_buf++ = g;
*lb_buf++ = r;
x++;
}
ਐਰੇ ਘੋਸ਼ਣਾ
// 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];
....
}
....
}
ਇਹਨਾਂ ਦੋ ਫਾਈਲਾਂ ਵਿੱਚ ਐਰੇ ਦੀ ਘੋਸ਼ਣਾ ਅਤੇ ਪਰਿਭਾਸ਼ਾ ਅਸੰਗਤ ਹੈ - ਆਕਾਰ 1 ਦੁਆਰਾ ਵੱਖਰਾ ਹੈ। ਹਾਲਾਂਕਿ, ਕੋਈ ਗਲਤੀ ਨਹੀਂ ਹੁੰਦੀ ਹੈ - evdev-map.c ਫਾਈਲ ਵਿੱਚ ਸਹੀ ਆਕਾਰ ਨਿਰਧਾਰਤ ਕੀਤਾ ਗਿਆ ਹੈ, ਇਸਲਈ ਕੋਈ ਹੱਦ ਤੋਂ ਬਾਹਰ ਨਹੀਂ ਹੈ। ਇਸ ਲਈ ਇਹ ਸਿਰਫ਼ ਇੱਕ ਬੱਗ ਹੈ ਜਿਸ ਨੂੰ ਆਸਾਨੀ ਨਾਲ ਠੀਕ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।
ਗਲਤ ਤੁਲਨਾ
// 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))
{
....
}
....
}
ਫੰਕਸ਼ਨ ਇੱਕ ਕਿਸਮ ਵੇਰੀਏਬਲ ਪੜ੍ਹਦਾ ਹੈ ਘੱਟ ਦਸਤਖਤ ਕੀਤੇ ਵਰਗੇ ਇੱਕ ਵੇਰੀਏਬਲ ਵਿੱਚ ਇੰਟ. ਇੱਥੇ ਜਾਂਚ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਅਸੀਂ ਇੱਕ ਅਸਾਈਨ ਕੀਤੇ ਵੇਰੀਏਬਲ ਨੂੰ ਪੜ੍ਹ ਰਹੇ ਹਾਂ ਅਤੇ ਨਤੀਜੇ ਨੂੰ ਇੱਕ ਵੱਡੇ ਵੇਰੀਏਬਲ ਨੂੰ ਸੌਂਪ ਰਹੇ ਹਾਂ, ਇਸਲਈ ਵੇਰੀਏਬਲ ਇੱਕ ਨੈਗੇਟਿਵ ਮੁੱਲ ਨਹੀਂ ਲੈ ਸਕਦਾ ਹੈ।
ਬੇਲੋੜੀ ਜਾਂਚ
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;
}
....
}
ਅਸਮਾਨਤਾ ਜਾਂਚਾਂ ਦਾ ਇੱਥੇ ਕੋਈ ਮਤਲਬ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਸਾਡੇ ਕੋਲ ਸ਼ੁਰੂਆਤ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਤੁਲਨਾ ਹੈ। ਇਹ ਸੰਭਾਵਨਾ ਹੈ ਕਿ ਇਹ ਇੱਕ ਟਾਈਪੋ ਹੈ ਅਤੇ ਡਿਵੈਲਪਰ ਆਪਰੇਟਰ ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਚਾਹੁੰਦਾ ਸੀ || ਅਵੈਧ ਆਰਗੂਮੈਂਟਾਂ ਨੂੰ ਫਿਲਟਰ ਕਰਨ ਲਈ।
ਸਿੱਟਾ
ਆਡਿਟ ਦੌਰਾਨ, ਕੋਈ ਗੰਭੀਰ ਤਰੁੱਟੀਆਂ ਦੀ ਪਛਾਣ ਨਹੀਂ ਕੀਤੀ ਗਈ, ਪਰ ਬਹੁਤ ਸਾਰੀਆਂ ਕਮੀਆਂ ਪਾਈਆਂ ਗਈਆਂ। ਹਾਲਾਂਕਿ, ਇਹ ਡਿਜ਼ਾਈਨ ਬਹੁਤ ਸਾਰੇ ਸਿਸਟਮਾਂ ਵਿੱਚ ਵਰਤੇ ਜਾਂਦੇ ਹਨ, ਭਾਵੇਂ ਦਾਇਰਾ ਵਿੱਚ ਛੋਟਾ ਹੁੰਦਾ ਹੈ। ਇੱਕ ਛੋਟੇ ਪ੍ਰੋਜੈਕਟ ਵਿੱਚ ਜ਼ਰੂਰੀ ਤੌਰ 'ਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਗਲਤੀਆਂ ਨਹੀਂ ਹੁੰਦੀਆਂ, ਇਸ ਲਈ ਤੁਹਾਨੂੰ ਸਿਰਫ ਛੋਟੇ ਪ੍ਰੋਜੈਕਟਾਂ 'ਤੇ ਵਿਸ਼ਲੇਸ਼ਕ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਦਾ ਨਿਰਣਾ ਨਹੀਂ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ। ਤੁਸੀਂ ਇਸ ਬਾਰੇ ਲੇਖ ਵਿੱਚ ਹੋਰ ਪੜ੍ਹ ਸਕਦੇ ਹੋ "
ਤੁਸੀਂ ਸਾਡੇ ਤੋਂ PVS-ਸਟੂਡੀਓ ਦਾ ਟ੍ਰਾਇਲ ਵਰਜਨ ਡਾਊਨਲੋਡ ਕਰ ਸਕਦੇ ਹੋ
ਜੇਕਰ ਤੁਸੀਂ ਇਸ ਲੇਖ ਨੂੰ ਅੰਗਰੇਜ਼ੀ ਬੋਲਣ ਵਾਲੇ ਦਰਸ਼ਕਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਅਨੁਵਾਦ ਲਿੰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ: ਸਰਗੇਈ ਲਾਰਿਨ।
ਸਰੋਤ: www.habr.com