473,387 Members | 1,882 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

Bad code or bad compiler?


A C program with code typified by the following pared-down example
has been running after compilation on numerous compilers for several
years. However with a fairly recent GCC compiler it results in a
segmentation fault at the indicated instruction.

Briefly, the problem occurs when writing to an array element when
the array pointer is allocated by a function in the array index.

My question: Is this bad C code, "unwise" C code, or a compiler bug?

(Note: This simple example is obviously not production code.)

Thanks for your help.

Regards,
Charles Sullivan

-----------------------------------------
#include <stdio.h>
#include <stdlib.h>

int nextindex ( int **arrayp )
{
static int lastindex = -1;

if ( *arrayp == NULL )
*arrayp = calloc(100, sizeof(int));

return ++lastindex;
}

int main ( void )
{
int j;
int *array = NULL;

for ( j = 0; j < 10; j++ )
array[nextindex(&array)] = 10 * j; /* segfaults */

for ( j = 0; j < 5; j++ )
printf("array[%d] = %d\n", j, array[j]);

return 0;
}
--------------------------------------
Jun 1 '08 #1
19 1742

"Charles Sullivan" <cw******@triad.rr.comwrote in message
news:48**********************@roadrunner.com...
>
A C program with code typified by the following pared-down example
has been running after compilation on numerous compilers for several
years. However with a fairly recent GCC compiler it results in a
segmentation fault at the indicated instruction.

Briefly, the problem occurs when writing to an array element when
the array pointer is allocated by a function in the array index.

My question: Is this bad C code, "unwise" C code, or a compiler bug?

(Note: This simple example is obviously not production code.)

Thanks for your help.

Regards,
Charles Sullivan

-----------------------------------------
#include <stdio.h>
#include <stdlib.h>

int nextindex ( int **arrayp )
{
static int lastindex = -1;

if ( *arrayp == NULL )
*arrayp = calloc(100, sizeof(int));

Aren't you supposed to check whether calloc returns a valid pointer? (I know
it's a little different to malloc)

What's the value of *arrayp (or array in main()) anyway, just before it goes
wrong?

--
Bartc
Jun 1 '08 #2
On Jun 1, 2:27*pm, Charles Sullivan <cwsul...@triad.rr.comwrote:
A C program with code typified by the following pared-down example
has been running after compilation on numerous compilers for several
years. *However with a fairly recent GCC compiler it results in a
segmentation fault at the indicated instruction.

Briefly, the problem occurs when writing to an array element when
the array pointer is allocated by a function in the array index.

My question: Is this bad C code, "unwise" C code, or a compiler bug?

(Note: This simple example is obviously not production code.)

Thanks for your help.

Regards,
Charles Sullivan

-----------------------------------------
#include <stdio.h>
#include <stdlib.h>

int nextindex ( int **arrayp )
{
* *static int lastindex = -1;

* *if ( *arrayp == NULL )
* * * *arrayp = calloc(100, sizeof(int));

* *return ++lastindex;

}

int main ( void )
{
* *int j;
* *int *array = NULL;

* *for ( j = 0; j < 10; j++ )
* * * array[nextindex(&array)] = 10 * j; */* segfaults */

* *for ( j = 0; j < 5; j++ )
* * * printf("array[%d] = %d\n", j, array[j]);

* *return 0;}

--------------------------------------
Bad code. The seg fault line is the same as

*(array + nextindex(&array)) = 10 * j;

The operands can be evaluated in either order. So the compiler is
allowed to e.g generate code that loads the value of array into a
register, followed by the (potentially inlined) nextindex
computation. My guess is that this is what's happening.
Jun 1 '08 #3
Charles wrote:
) A C program with code typified by the following pared-down example
) has been running after compilation on numerous compilers for several
) years. However with a fairly recent GCC compiler it results in a
) segmentation fault at the indicated instruction.

<snip code for nextindex, which modifies what its argument points to>

) for ( j = 0; j < 10; j++ )
) array[nextindex(&array)] = 10 * j; /* segfaults */

I think this is an instance of 'modifying a variable and using its value
more than once between two sequence points'. You know, like 'i + i++'.
So that is UB, and therefore the segfault can be expected.
If I'm correct, you were simply lucky it worked for so long.

You can rewrite it to:
for ( j = 0; j < 10; j++ )
nextindex(&array) = 10 * j;

And have nextindex return *arrayp + ++lastindex;
SaSW, Willem
--
Disclaimer: I am in no way responsible for any of the statements
made in the above text. For all I know I might be
drugged or something..
No I'm not paranoid. You all think I'm paranoid, don't you !
#EOT
Jun 1 '08 #4
Willem wrote:
I think this is an instance of 'modifying a variable and using its value
more than once between two sequence points'. You know, like 'i + i++'.
????

Which variable is being MODIFIED ???

Array is just being READ, not modified in any way!

The array position at array+nextindex() is being
modified, but the variable array is not modified at all.
It always point to the first element of the array.

--
jacob navia
jacob at jacob point remcomp point fr
logiciels/informatique
http://www.cs.virginia.edu/~lcc-win32
Jun 1 '08 #5
Gene wrote:
On Jun 1, 2:27 pm, Charles Sullivan <cwsul...@triad.rr.comwrote:
>A C program with code typified by the following pared-down example
has been running after compilation on numerous compilers for several
years. However with a fairly recent GCC compiler it results in a
segmentation fault at the indicated instruction.

Briefly, the problem occurs when writing to an array element when
the array pointer is allocated by a function in the array index.

My question: Is this bad C code, "unwise" C code, or a compiler bug?

(Note: This simple example is obviously not production code.)

Thanks for your help.

Regards,
Charles Sullivan

-----------------------------------------
#include <stdio.h>
#include <stdlib.h>

int nextindex ( int **arrayp )
{
static int lastindex = -1;

if ( *arrayp == NULL )
*arrayp = calloc(100, sizeof(int));

return ++lastindex;

}

int main ( void )
{
int j;
int *array = NULL;

for ( j = 0; j < 10; j++ )
array[nextindex(&array)] = 10 * j; /* segfaults */

for ( j = 0; j < 5; j++ )
printf("array[%d] = %d\n", j, array[j]);

return 0;}

--------------------------------------

Bad code. The seg fault line is the same as

*(array + nextindex(&array)) = 10 * j;
yes.
>
The operands can be evaluated in either order. So the compiler is
allowed to e.g generate code that loads the value of array into a
register, followed by the (potentially inlined) nextindex
computation.
Correct
My guess is that this is what's happening.

But why should that segment fault???

It is perfectly legal!

--
jacob navia
jacob at jacob point remcomp point fr
logiciels/informatique
http://www.cs.virginia.edu/~lcc-win32
Jun 1 '08 #6
Bartc wrote:
"Charles Sullivan" <cw******@triad.rr.comwrote in message
news:48**********************@roadrunner.com...
>A C program with code typified by the following pared-down example
has been running after compilation on numerous compilers for several
years. However with a fairly recent GCC compiler it results in a
segmentation fault at the indicated instruction.

Briefly, the problem occurs when writing to an array element when
the array pointer is allocated by a function in the array index.

My question: Is this bad C code, "unwise" C code, or a compiler bug?

(Note: This simple example is obviously not production code.)

Thanks for your help.

Regards,
Charles Sullivan

-----------------------------------------
#include <stdio.h>
#include <stdlib.h>

int nextindex ( int **arrayp )
{
static int lastindex = -1;

if ( *arrayp == NULL )
*arrayp = calloc(100, sizeof(int));


Aren't you supposed to check whether calloc returns a valid pointer? (I know
it's a little different to malloc)

What's the value of *arrayp (or array in main()) anyway, just before it goes
wrong?

With lcc-win you program produces the expected results.
I do not see anything wrong with it.
--
jacob navia
jacob at jacob point remcomp point fr
logiciels/informatique
http://www.cs.virginia.edu/~lcc-win32
Jun 1 '08 #7
jacob navia <ja***@nospam.comwrites:
Willem wrote:
>I think this is an instance of 'modifying a variable and using its value
more than once between two sequence points'. You know, like 'i + i++'.

????

Which variable is being MODIFIED ???

Array is just being READ, not modified in any way!

The array position at array+nextindex() is being
modified, but the variable array is not modified at all.
It always point to the first element of the array.
&array is being passed as an argument to a function, which can modify
the value of array.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
Jun 1 '08 #8
On Sun, 01 Jun 2008 18:52:21 +0000, Bartc wrote:
"Charles Sullivan" <cw******@triad.rr.comwrote in message
news:48**********************@roadrunner.com...
>>
A C program with code typified by the following pared-down example has
been running after compilation on numerous compilers for several years.
However with a fairly recent GCC compiler it results in a segmentation
fault at the indicated instruction.

Briefly, the problem occurs when writing to an array element when the
array pointer is allocated by a function in the array index.

My question: Is this bad C code, "unwise" C code, or a compiler bug?

(Note: This simple example is obviously not production code.)

Thanks for your help.

Regards,
Charles Sullivan

----------------------------------------- #include <stdio.h>
#include <stdlib.h>

int nextindex ( int **arrayp )
{
static int lastindex = -1;

if ( *arrayp == NULL )
*arrayp = calloc(100, sizeof(int));


Aren't you supposed to check whether calloc returns a valid pointer? (I
know it's a little different to malloc)
As I said, this is not production code - just a very simple example
which replicates the problem. The production code checks for a valid
pointer within the function nextindex() and it's always been valid.
What's the value of *arrayp (or array in main()) anyway, just before it
goes wrong?
I had assumed that the index of an array would be computed before
attempting to write to the array, but evidently that's not happening
with this compiler (GCC 4.3.0).

If instead of:
array[nextindex(&array)] = 10 * j;

the code is changed to:
int i;
for ( j = 0; j < 10; j++ ) {
i = nextindex[&array];
array[i] = 10 * j;
}

-- or even just --
nextindex(&array);
for ( j = 0; j < 10; j++ )
array[nextindex(&array)] = 10 * j;

There's no segfault (although in the latter I'm now skipping element 0 of
array[]).

Regards,
Charles Sullivan



Jun 1 '08 #9
In article <ln************@nuthaus.mib.org>,
Keith Thompson <ks***@mib.orgwrote:
>jacob navia <ja***@nospam.comwrites:
>Willem wrote:
>>I think this is an instance of 'modifying a variable and using its value
more than once between two sequence points'. You know, like 'i + i++'.

????

Which variable is being MODIFIED ???

Array is just being READ, not modified in any way!

The array position at array+nextindex() is being
modified, but the variable array is not modified at all.
It always point to the first element of the array.

&array is being passed as an argument to a function, which can modify
the value of array.
Right. Another way to look at it is that the first time through the
loop, array (an "int *" type variable) has the value NULL.

So, the compiler is allowed to compile the LHS of:

array[nextindex(&array)] = 10 * j; /* segfaults */

As if it was:

NULL[nextindex(&array)]

which is legal syntax, but is unlikely to survive at runtime.

Jun 1 '08 #10
Charles Sullivan wrote:
int nextindex ( int **arrayp )
{
static int lastindex = -1;

if ( *arrayp == NULL )
*arrayp = calloc(100, sizeof(int));

return ++lastindex;
}

int main ( void )
{
int j;
int *array = NULL;

for ( j = 0; j < 10; j++ )
array[nextindex(&array)] = 10 * j; /* segfaults */

for ( j = 0; j < 5; j++ )
printf("array[%d] = %d\n", j, array[j]);

return 0;
}
jacob navia wrote:
Willem wrote:
>I think this is an instance of 'modifying a variable and using its value
more than once between two sequence points'. You know, like 'i + i++'.
Which variable is being MODIFIED ???
array.
Array is just being READ, not modified in any way!
It is modified by nextindex().
The array position at array+nextindex() is being
modified, but the variable array is not modified at all.
It always point to the first element of the array.
On first call to nextindex(), array does not point to any array.

--
Thad
Jun 1 '08 #11
Charles Sullivan wrote:
I had assumed that the index of an array would be computed before
attempting to write to the array, but evidently that's not happening
with this compiler (GCC 4.3.0).
The index is necessarily computed before attempting to write to an indexed
array element.
If instead of:
array[nextindex(&array)] = 10 * j;

the code is changed to:
int i;
for ( j = 0; j < 10; j++ ) {
i = nextindex[&array];
array[i] = 10 * j;
}
....
There's no segfault...
That's because the latter has a sequence point between the first call to
nextindex() and referencing array for the assignment. The former does not.
A compiler is free to generate code for the former as if written;
int *temp1 = array;
temp1 += nextindex(&array);
int temp2 = 10*j;
*temp1 = temp2;

which attempts to dereference the original array value of NULL.

--
Thad
Jun 1 '08 #12
Charles Sullivan wrote:
A C program with code typified by the following pared-down example
has been running after compilation on numerous compilers for several
years. However with a fairly recent GCC compiler it results in a
segmentation fault at the indicated instruction.

Briefly, the problem occurs when writing to an array element when
the array pointer is allocated by a function in the array index.

My question: Is this bad C code, "unwise" C code, or a compiler bug?
Bad C code. There's undefined behavior here:
array[nextindex(&array)] = 10 * j; /* segfaults */
^^^^^ ^^^^^^^^^^^^^^^^^
1 2

.... because it is unspecified whether part (1) or (2) of
the expression is evaluated first. If (2) is evaluated
first then the `array' pointer is set non-NULL inside the
function, and all's well. But if (1) is evaluated first,
you get `((int*)NULL)[...] = ...' and undefined behavior.

--
Eric Sosman
es*****@ieee-dot-org.invalid
Jun 1 '08 #13
jacob navia <ja***@nospam.comwrote:
Gene wrote:
array[nextindex(&array)] = 10 * j; /* segfaults */
Bad code. The seg fault line is the same as

*(array + nextindex(&array)) = 10 * j;
The operands can be evaluated in either order. So the compiler is
allowed to e.g generate code that loads the value of array into a
register, followed by the (potentially inlined) nextindex
computation.
Correct
My guess is that this is what's happening.
But why should that segment fault???
It is perfectly legal!
If you have

*(array + nextindex(&array)) = 10 * j;

and it first evaluates the 'array' part, which is NULL (at least
initially, and then adds the return value of the nextindex() call,
then you get either again the NULL pointer (if nextindex() did
return 0) or some value near to NULL, which rather likely also
isn't a pointer that can be dereferenced. Thus the segmentation
fault. So I don't think that this is legal code when it depends
on the order of the evaluation of the expression in parentheses.

Regards, Jens
--
\ Jens Thoms Toerring ___ jt@toerring.de
\__________________________ http://toerring.de
Jun 1 '08 #14
On Sun, 01 Jun 2008 21:34:30 +0200, jacob navia <ja***@nospam.com>
wrote:
>Gene wrote:
>On Jun 1, 2:27 pm, Charles Sullivan <cwsul...@triad.rr.comwrote:
>>A C program with code typified by the following pared-down example
has been running after compilation on numerous compilers for several
years. However with a fairly recent GCC compiler it results in a
segmentation fault at the indicated instruction.

Briefly, the problem occurs when writing to an array element when
the array pointer is allocated by a function in the array index.

My question: Is this bad C code, "unwise" C code, or a compiler bug?

(Note: This simple example is obviously not production code.)

Thanks for your help.

Regards,
Charles Sullivan

-----------------------------------------
#include <stdio.h>
#include <stdlib.h>

int nextindex ( int **arrayp )
{
static int lastindex = -1;

if ( *arrayp == NULL )
*arrayp = calloc(100, sizeof(int));

return ++lastindex;

}

int main ( void )
{
int j;
int *array = NULL;

for ( j = 0; j < 10; j++ )
array[nextindex(&array)] = 10 * j; /* segfaults */

for ( j = 0; j < 5; j++ )
printf("array[%d] = %d\n", j, array[j]);

return 0;}

--------------------------------------

Bad code. The seg fault line is the same as

*(array + nextindex(&array)) = 10 * j;

yes.
>>
The operands can be evaluated in either order. So the compiler is
allowed to e.g generate code that loads the value of array into a
register, followed by the (potentially inlined) nextindex
computation.

Correct
My guess is that this is what's happening.

But why should that segment fault???
At the first iteration through the loop, array is NULL. NULL +
anything does not point to memory you own.
>
It is perfectly legal!
You can't dereference memory you don't own.
Remove del for email
Jun 1 '08 #15
On Sun, 1 Jun 2008 19:24:19 +0000 (UTC), Willem <wi****@stack.nl>
wrote:
>Charles wrote:
) A C program with code typified by the following pared-down example
) has been running after compilation on numerous compilers for several
) years. However with a fairly recent GCC compiler it results in a
) segmentation fault at the indicated instruction.

<snip code for nextindex, which modifies what its argument points to>

) for ( j = 0; j < 10; j++ )
) array[nextindex(&array)] = 10 * j; /* segfaults */

I think this is an instance of 'modifying a variable and using its value
more than once between two sequence points'. You know, like 'i + i++'.
So that is UB, and therefore the segfault can be expected.
If I'm correct, you were simply lucky it worked for so long.
There is a sequence point before and after the call to nextindex. The
undefined behavior comes during execution due to dereferencing a NULL
pointer.
>
You can rewrite it to:
for ( j = 0; j < 10; j++ )
nextindex(&array) = 10 * j;

And have nextindex return *arrayp + ++lastindex;
SaSW, Willem

Remove del for email
Jun 1 '08 #16

Thanks guys. I now have a much better understanding of what's
happening.

Since the actual production code also uses realloc() to extend the array,
I took the easy way out and recoded:

for ( j = 0; j < 10; j++ )
array[nextindex(&array)] = 10 * j; /* segfaults */

instead as:

int i;
for ( j = 0; j < 10; j++ ) {
i = nextindex(&array);
array[i] = 10 * j;
}

Many thanks to all who contributed to the discussion.

Regards,
Charles Sullivan

Jun 1 '08 #17
Thad Smith <ThadSm...@acm.orgwrote:
jacob navia wrote:
Willem wrote:
Charles Sullivan wrote:
int nextindex ( int **arrayp )
{
* *static int lastindex = -1;

* *if ( *arrayp == NULL )
* * * *arrayp = calloc(100, sizeof(int));

* *return ++lastindex;
}

int main ( void )
{
* *int j;
* *int *array = NULL;

* *for ( j = 0; j < 10; j++ )
* * * array[nextindex(&array)] = 10 * j; */* segfaults */

* *for ( j = 0; j < 5; j++ )
* * * printf("array[%d] = %d\n", j, array[j]);

* *return 0;
}
>
I think this is an instance of 'modifying a variable
and using its value more than once between two sequence
points'.
You think wrong.
*You know, like 'i + i++'.
Which variable is being MODIFIED ???

array.
The function call is a sequence point. The array object
is not modified between 'previous and next' sequence
points.
Array is just being READ, not modified in any way!

It is modified by nextindex().
Which is incidental to Willem's claim.
The array position at array+nextindex() is being
modified, but the variable array is not modified
at all.
It always point to the first element of the array.
It would if it was an array, but it isn't, it's a
pointer which begins its life as a null pointer.
On first call to nextindex(), array does not point
to any array.
The UB comes simply from the unspecified order of
evaluation, and potential dereferencing of a null
pointer, not 6.5p2 as people have expressed.

--
Peter
Jun 2 '08 #18
Barry Schwarz wrote:
On Sun, 1 Jun 2008 19:24:19 +0000 (UTC), Willem <wi****@stack.nl>
wrote:
>Charles wrote:
) A C program with code typified by the following pared-down example
) has been running after compilation on numerous compilers for several
) years. However with a fairly recent GCC compiler it results in a
) segmentation fault at the indicated instruction.

<snip code for nextindex, which modifies what its argument points to>

) for ( j = 0; j < 10; j++ )
) array[nextindex(&array)] = 10 * j; /* segfaults */

I think this is an instance of 'modifying a variable and using its value
more than once between two sequence points'. You know, like 'i + i++'.
So that is UB, and therefore the segfault can be expected.
If I'm correct, you were simply lucky it worked for so long.

There is a sequence point before and after the call to nextindex.
Yes. One of those sequence points then separates accessing array for
dereferencing and assigning array from within nextindex.
The
undefined behavior comes during execution due to dereferencing a NULL
pointer.
As I read the standard, it is first _unspecified_ which value array has for
dereferencing (Section 6.5 p3), then if array null, an attempt to
dereference results in undefined behavior. Taken together, the result is
undefined behavior due to possibility (implemention choice) of
dereferencing a null pointer.

--
Thad
Jun 2 '08 #19
On 1 Jun, 20:38, Keith Thompson <ks...@mib.orgwrote:
jacob navia <ja...@nospam.comwrites:
Willem wrote:
I think this is an instance of 'modifying a variable and using its value
more than once between two sequence points'. *You know, like 'i + i++'.
????
Which variable is being MODIFIED ???
Array is just being READ, not modified in any way!
The array position at array+nextindex() is being
modified, but the variable array is not modified at all.
It always point to the first element of the array.

&array is being passed as an argument to a function, which can modify
the value of array.
almost certainly *does* modify the value of array as calloc()
is called

--
Nick keighley
Jun 2 '08 #20

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

242
by: James Cameron | last post by:
Hi I'm developing a program and the client is worried about future reuse of the code. Say 5, 10, 15 years down the road. This will be a major factor in selecting the development language. Any...
2
by: Bryan Olson | last post by:
The current Python standard library provides two cryptographic hash functions: MD5 and SHA-1 . The authors of MD5 originally stated: It is conjectured that it is computationally infeasible to...
14
by: joshc | last post by:
I'm writing some C to be used in an embedded environment and the code needs to be optimized. I have a question about optimizing compilers in general. I'm using GCC for the workstation and Diab...
10
by: Mike | last post by:
Is it still true that the managed C++ compiler will produce much better opimizations than the C# compiler, or have some of the more global/aggressive opimizations been rolled into the 2005...
88
by: Peter Olcott | last post by:
Cab you write code directly in the Common Intermediate language? I need to optimize a critical real-time function.
15
by: kenneth | last post by:
I was trying to use multiple thread to optimize my following code, but met some problems, anyone can help me? k are initialized. int computePot() { int i, j; for( i=0; i<500; i++ ) { for(...
0
by: vve | last post by:
I'm discovering a strange behaviour in an C# project using ZedGraph (https://sourceforge.net/projects/zedgraph/). After adding a signal to it, it seems that the clr goes mad for some reason. I...
31
by: somenath | last post by:
Hi All, I was going through one of the exercise of one C tutorial . In that they have given one small code and asked about the output. #include <stdio.h> int main(void) { int x =...
27
by: Dave | last post by:
I'm having a hard time tying to build gcc 4.3.1 on Solaris using the GNU compilers. I then decided to try to use Sun's compiler. The Sun Studio 12 compiler reports the following code, which is in...
144
by: dominantubergeek | last post by:
Hello, I'm a highly experienced expert C programmer and I've written this code to reverse a string in place. I think you could all learn something from it! int reverse(char* reverseme){ int...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.