
struct host
{
	// ...
};

host gethostbyname(const char *str);
char *strcpy(char *s1, const char *s2);
char *strcat(char *s1, const char *s2);

void openUrl(const char *url)
{
	// ...

	host myHost = gethostbyname(url); // $ Sink

	// ...
}

void doNothing(char *url)
{
}

const char *url_g = "http://example.com"; // $ Alert // BAD

void test()
{
	openUrl("http://example.com"); // $ Alert // BAD
	openUrl("https://example.com"); // GOOD (https)
	openUrl("http://localhost/example"); // GOOD (localhost)
	openUrl("https://localhost/example"); // GOOD (https, localhost)
	doNothing("http://example.com"); // GOOD (URL not used)

	{
		const char *url_l = "http://example.com"; // $ Alert // BAD
		const char *urls[] = { "http://example.com" }; // $ Alert // BAD

		openUrl(url_g);
		openUrl(url_l);
		openUrl(urls[0]);
	}

	{
		char buffer[1024];

		strcpy(buffer, "http://"); // $ Alert // BAD
		strcat(buffer, "example.com");

		openUrl(buffer);
	}

	{
		char buffer[1024];

		strcpy(buffer, "https://"); // GOOD (https)
		strcat(buffer, "example.com");

		openUrl(buffer);
	}
}

typedef unsigned long size_t;
int strncmp(const char *s1, const char *s2, size_t n);
char* strstr(char* s1, const char* s2);

void test2(const char *url)
{
	if (strncmp(url, "http://", 7)) // GOOD (or at least dubious; we are not constructing the URL)
	{
		openUrl(url);
	}
}

void test3(char *url)
{
	char *ptr;

	ptr = strstr(url, "https://"); // GOOD (https)
	if (!ptr)
	{
		ptr = strstr(url, "http://"); // GOOD (we are not constructing the URL)
	}

	if (ptr)
	{
		openUrl(ptr);
	}
}

void test4(char *url)
{
	const char *https_string = "https://"; // GOOD (https)
	const char *http_string = "http://"; // GOOD (we are not constructing the URL)
	char *ptr;

	ptr = strstr(url, https_string);
	if (!ptr)
	{
		ptr = strstr(url, http_string);
	}

	if (ptr)
	{
		openUrl(ptr);
	}
}

void test5()
{
	char *url_string = "http://example.com"; // $ Alert // BAD
	char *ptr;

	ptr = strstr(url_string, "https://"); // GOOD (https)
	if (!ptr)
	{
		ptr = strstr(url_string, "http://"); // GOOD (we are not constructing the URL here)
	}

	if (ptr)
	{
		openUrl(ptr);
	}
}
